Как я изменяю линию файла в Пайтоне?

Вы знаете, может ли файл открываться с Пайтоном, и что был одновременно чтения и написания?

Я нуждаюсь в том, чтобы изменить параметр файла (line2.split(";")[3])='1' и консультироваться 5 секунд спустя и в том же файле, другом поле ValorCambiado = line2.split(";")[6].

У файла есть следующий формат:

ALARMA1;0;1;1;4;8;8 (Lo que tengo en origen)
ALARMA2;0;1;1;4;8;8

ALARMA1;0;1;1;4;8;1 (Lo que pretendo conseguir)
ALARMA2;0;1;1;4;8;8

Я хочу изменить какую-либо из стоимости ALARMA1 ó ALARMA2 файла но оставшейся части сохранить это как дела. А именно, делать инъекцию конкретной стоимости в часть линии (В примере он изменен line1.split(";")[6] = 8 (раньше); line1.split(";")[6] = 1 (сейчас)). Но оставшаяся часть файла осталась бы равной, и с тем же именем файла.

Это возможное в Пайтоне?

3
задан 23.11.2016, 18:43
2 ответа

Если ты делаешь это изменение во всех линиях, ты можешь делать что-то как это:

contenido= list()

with open('fichero.txt', 'r') as archivo:
   for linea in archivo:
       columnas = linea.split(';')
       columnas[6] = '1'
       contenido.append(';'.join(columnas)+'\n')

with open('fichero.txt', 'w') as archivo:
    archivo.writelines(contenido)

Если ты только это делаешь, в каких-то ты можешь использовать enumerate или сохранять документ в списке используя readlines() и использовать индекс, чтобы изменять только те, которые ты хочешь. Пример:

def modificar_dato(ruta, filas, columna, nuevo_dato):
    contenido = list()
    with open(ruta, 'r+') as archivo:
        contenido = archivo.readlines()
        for fila in filas:
            columnas = contenido[fila-1].split(';')
            columnas[columna] = nuevo_dato
            contenido[fila-1] = ';'.join(columnas)+ '\n'
    with open(ruta, 'w') as archivo:
        archivo.writelines(contenido)

Второй параметр функции - список с nmeros линий, которые ты хочешь изменить, например, чтобы изменять ее первый, ты называешь вторую и пятую линию следующей формы:

modificar_dato('fichero.txt', [1,2,5], 6, '1')

Это изменит такой dichero как этот:

ALARMA1;0;1;1;4;8;8
ALARMA2;0;1;1;4;8;8
ALARMA3;0;1;1;4;8;8
ALARMA4;0;1;1;4;8;8
ALARMA5;0;1;1;4;8;8
ALARMA6;0;1;1;4;8;8

оставляя это таким:

ALARMA1;0;1;1;4;8;1
ALARMA2;0;1;1;4;8;1
ALARMA3;0;1;1;4;8;8
ALARMA4;0;1;1;4;8;8
ALARMA5;0;1;1;4;8;1
ALARMA6;0;1;1;4;8;8

Другая возможность состоит в том, чтобы создавать временный файл, читать каждую линию оригинала, изменять ее и писать ее во временном файле. Закончившись заменяется оригинал на ненастье. Это более рекомендуемое, если мы говорим о больших файлах.

Третий путь состоит в том, чтобы использовать, как уже я комментировал тебе в другом вопросе модуль csv так как ты работаешь с этим типом файлов, и этот модуль облегчает достаточно вещи.

3
ответ дан 24.11.2019, 12:27
  • 1
    Совершенный. inyecció n данных в файле оно функционировало правильно. В конце концов quedarí в серьгу пробегать файл видя, что он изменился в файле вывода, сделав инъекцию стоимости. Если ALARMA1 он происходит того, чтобы быть ALARMA1; 0; 1; 1; 4; 8; 8, чтобы быть ALARMA1; 0; 1; 1; 4; 8; 9 так как подтверждать изменения в самой тревоге и в оставшейся части. Чтобы подтверждать в sí та же sí что sé как делание этого, но чтобы смотреть, изменилось ли что-то в оставшейся части не sabrí в как смотреть это. –  AlberM 24.11.2016, 11:24
  • 2
    @AlberM, чтобы видеть, есть ли изменения в одиноком файле, ты нуждаешься в копии в памяти как списке contenido раньше или к диску, открывать документ снова вслед за x минуты и идти линия из-за линии или даже колонна из-за колонны сравнивая, если они равны. Не точно, что ты хочешь сравнить документ, когда ты имеешь в виду fichero de salida, или что ты надеешься, что он возвращает тебя, если он находит изменение. Если ты остаешься с проблемами, ты можешь задавать другой вопрос объясняя это хорошо или даже говорить из-за чат , если он не заслуживает новый вопрос. –  FJSevilla 24.11.2016, 11:59

Чтобы открывать файл в способе Чтение и Написание одновременно использует курсор r+, когда ты откроешь файл. Пример:

with open("fichero.txt", "r+") as fichero:
    fichero.read()
    fichero.write("prueba")
    fichero.close()
3
ответ дан 24.11.2019, 12:27
  • 1
    Я хочу изменить только поле меня fichero.txt. Я объясняюсь.... У меня есть один fichero.txt и я хочу, что поле 4 каждого lí nea взял стоимость 1 и оставшаяся часть это оставила как está. ALARMA1,0,1,1,2 (то, что у меня есть) ALARMA2,0,1,1,9 ALARMA1,0,1,1,1 (то, что я хочу) ALARMA2,0,1,1,9 Только я хочу, чтобы поле 4 изменило в стоимость 1, но поддерживать равной оставшуюся часть файла (line1.split ("; ") [4]) == 1). ¿ Это возможное? –  AlberM 23.11.2016, 17:00

Теги

Похожие вопросы