Почему этот скрипт Python не заменит одну переменную другой? - PullRequest
0 голосов
/ 25 октября 2018

У меня есть CSV-файл с двумя столбцами, один из которых слева - старая строка, а другой - справа.У меня есть куча XML-файлов, которые содержат старые строки, которые мне нужно заменить / обновить новыми.

Сценарий должен открывать каждый XML-файл по одному и заменять всестарые строки в CSV-файле с новыми.Я попытался использовать функцию замены, чтобы заменить экземпляры старой строки, названной 'column [0]', новой строкой, названной 'column [1]'.Однако я, должно быть, что-то упускаю, так как это, похоже, ничего не делает.Если первая переменная в функции замены в реальной строке с кавычками, функция замены работает.Однако, если оба термина в функции замены являются переменными, это не так.

Кто-нибудь знает, что я делаю неправильно?

import os
import csv

with open('csv.csv') as csv:
    lines = csv.readline()
    column = lines.split(',')

    fileNames=[f for f in os.listdir('.') if f.endswith('.xml')]
    for f in fileNames:
        x=open(f).read()
        x=x.replace(column[0],column[1])
        print(x)

Пример файла CSV:

oldstring1,newstring1
oldstring2,newstring2

Пример файла .xml:

Word words words oldstring1 words words words oldstring2

Что я хочу в новых файлах .xml:

Word words words newstring1 words words words newstring2

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Проблема здесь в том, что вы рассматриваете файл CSV как обычный текстовый файл, не зацикливаясь на всех строках файла CSV.

Вам необходимо прочитать файл с помощью csv reader

Следующий код будет работать для вашей задачи

import os
import csv
with open('csv.csv') as csvfile:
    reader = csv.reader(csvfile)
    fileNames=[f for f in os.listdir('.') if f.endswith('.xml')]
    for f in fileNames:
        x=open(f).read()
        for row in reader:
            x=x.replace(row[0],row[1])
        print(x)
0 голосов
/ 25 октября 2018

Похоже, это лучше сделать с помощью sed.Однако.

Если мы хотим использовать Python, мне кажется, что то, что вы хотите сделать, лучше всего достигается

  • , читая все пары устаревших замен и сохраняя их в списке.из списков,
  • имеют цикл над файлами .xml, , как указано в командной строке , с использованием удобного модуля fileinput, указывая, что мы хотимчтобы работать в очереди и что мы хотим хранить файлы резервных копий,
    • для каждой строки в каждой из .xml операций всех замен,
    • положенныхвернуть измененную строку в исходный файл (используя просто print, благодаря волшебству fileinput) (end='', потому что мы не хотим обрезать каждую строку, чтобы сохранить возможный пробел).
import fileinput
import sys

old_new = [line.strip().split(',') for line in open('csv.csv')]

for line in fileinput.input(sys.argv[1:], inplace=True, backup='.bak'):
    for old, new in old_new:
        line = line.replace(old, new)
    print(line, end='')

Если вы сохраните код в replace.py, вы выполните его следующим образом

$ python3 replace.py *.xml subdir/*.xml another_one/a_single.xml
...