Как подойти найти + заменить на RST файлы, используя Python или Grep - PullRequest
0 голосов
/ 29 мая 2019

Я пытаюсь автоматизировать поиск + замену для ряда неработающих ссылок на изображения в файлах .rst. У меня есть CSV-файл, где столбец A является "старой" ссылкой (которая видна в RST-файлах), а столбец B является новой ссылкой для замены для каждой строки.

Я не могу сначала использовать pandoc для преобразования в HTML, потому что он «ломает» первый файл. Я сделал это один раз для набора файлов HTML, используя BeautifulSoup и regex, но этот анализатор не будет работать для моих первых файлов.

Коллега предложил попробовать Grep, но я не могу понять, как вызвать файл csv, чтобы выполнить "match" и переключиться.

для html-файлов, он будет проходить по каждому файлу, искать тег img и заменять ссылки, используя файл csv в качестве dict

with open(image_csv, newline='') as f:
reader = csv.reader(f)
next(reader, None)  # Ignore the header row
for row in reader:
    graph_main_nodes.append(row[0])
    graph_child_nodes.append(row[1:])
graph = dict(zip(graph_main_nodes, graph_child_nodes))  # Dict with keys in correct location, vals in old locations

graph = dict((v, k) for k in graph for v in graph[k])

for fixfile in html:
try:
    with open(fixfile, 'r', encoding='utf-8') as f:
        soup = BeautifulSoup(f, 'html.parser')
        tags =  soup.findAll('img')
        for tag in tags:  
            print(tag['src'])
            if tag['src'] in graph.keys():
                tag['src'] = tag['src'].replace(tag['src'], graph[tag['src']])
                replaced_links += 1
                print("Match found!")
            else:
                orphan_links.append(tag["src"])
                print("Ignore")

Мне бы хотелось несколько советов о том, как подойти к этому. Я бы с удовольствием переназначил свой код BeautifulSoup, но не уверен, что это реально.

1 Ответ

1 голос
/ 29 мая 2019

Этот вопрос содержит информацию о разборе файла RST, но я не думаю, что это необходимо. Ваш вопрос сводится к замене textA на textB. У вас уже есть график с загруженным CSV, так что все должно быть в порядке с этим ( кредит на этот ответ )

# Read in the file
filedata = None
with open('fixfile', 'r', encoding='utf-8') as file:
  filedata = file.read()

# Replace the target strings
for old, new in graph.items():
  filedata.replace(old, new)

# Write the file out again
with open('fixfile', 'w', encoding='utf-8') as file:
  file.write(filedata)

Это также хороший кандидат на sed или perl. Используя что-то вроде этот ответ Также использовал этот ответ для помощи в определении редкого разделителя для sed. (измените -n на -i и p на g после тестирования, чтобы он действительно сохранил файл):

DELIM=$(echo -en "\001");
IFS=","
cat csvFile | while read PATTERN REPLACEMENT  # You feed the while loop with stdout lines and read fields separated by ":"
do
   sed -n "\\${DELIM}${PATTERN}${DELIM},\\${DELIM}${REPLACEMENT}${DELIM}p" fixfile.rst
done
...