Как редактировать определенную строку для всех текстовых файлов в папке с помощью Python? - PullRequest
0 голосов
/ 20 февраля 2019

Вот мой код о том, как редактировать текстовый файл.

Поскольку python не может просто редактировать строку и сохранять ее одновременно,

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

Например, если в одной папке есть два текстовых файла с именами sample1.txt и sample2.txt .

Sample1.txt
A для яблока.

Вторая строка.

Третья строка.

Sample2.txt
Первая строка.

Яблоко в день.

Третья строка.

Выполнить Python

import glob
import os

#search all text files which are in the same folder with python script
path = os.path.dirname(os.path.abspath(__file__))
txtlist = glob.glob(path + '\*.txt')

for file in txtlist:
    fp1 = open(file, 'r+')
    strings = [] #create a list to store the content
    for line in fp1:
        if 'apple' in line:
            strings.append('banana\n') #change the content and store into list
        else:
            strings.append(line) #store the contents did not be changed
    fp2 = open (file, 'w+') # rewrite the original text files
    for line in strings:
        fp2.write(line)
    fp1.close()
    fp2.close()

Sample1.txt
банан

Вторая строка.

Третья строка.

Sample2.txt
Первая строка.

банан

Третья строка.


Вот так я редактирую конкретную строку для текстового файла.

Мой вопрос: Есть ли какой-нибудь метод, способный сделать то же самое?

Как использовать другие функции или использовать другой тип данных вместо списка.

Спасибо всем.

Ответы [ 4 ]

0 голосов
/ 20 февраля 2019
import glob
import os


def replace_line(file_path, replace_table: dict) -> None:
    list_lines = []
    need_rewrite = False
    with open(file_path, 'r') as f:
        for line in f:
            flag_rewrite = False
            for key, new_val in replace_table.items():
                if key in line:
                    list_lines.append(new_val+'\n')
                    flag_rewrite = True
                    need_rewrite = True
                    break  # only replace first find the words.

            if not flag_rewrite:
                list_lines.append(line)

    if not need_rewrite:
        return

    with open(file_path, 'w') as f:
        [f.write(line) for line in list_lines]


if __name__ == '__main__':
    work_dir = os.path.dirname(os.path.abspath(__file__))
    txt_list = glob.glob(work_dir + '/*.txt')
    replace_dict = dict(apple='banana', orange='grape')

    for txt_path in txt_list:
        replace_line(txt_path, replace_dict)
0 голосов
/ 20 февраля 2019

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

def replace_word(filename):
    with open(filename, 'r') as file:
       data = file.read()

    data = data.replace('word1', 'word2')

    with open(filename, 'w') as file:
        file.write(data)

Затем вы можете перебрать все свои файлыи применить эту функцию

0 голосов
/ 20 февраля 2019

Встроенный модуль fileinput делает это довольно простым:

import fileinput
import glob

with fileinput.input(files=glob.glob('*.txt'), inplace=True) as files:
    for line in files:
        if 'apple' in line:
            print('banana')
        else:
            print(line, end='')

fileinput перенаправляет print в активный файл.

0 голосов
/ 20 февраля 2019

Упростите это до:

with open(fname) as f:
    content = f.readlines()
    content = ['banana' if line.find('apple') != -1 else line for line in content]

, а затем запишите значение content в файл обратно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...