Python - запись содержимого в существующий файл

amac спросил: 28 апреля 2018 в 09:48 в: python

Итак, моя цель - удалить все \ n из конца каждого файла в каталоге, а затем добавить файл. Стремясь сделать часть добавления.

import os
print("Copy paste full directory path here:")
directory = input()for filename in os.listdir(directory):
    if filename.endswith(".txt"):
        with open(os.path.join(directory, filename), "r+") as f:
            lines = f.readlines()        
            for line in lines:
                if lines[-1] in ['\n', '\r']:
                    lines = lines[:-1]
                    print(lines)     
            f.writelines(lines)

Таким образом, это делает практически то, что я хочу, однако оно добавляет все под контент, а не заменяет его. Могу ли я получить помощь для этого, пожалуйста:)?

3 ответа

mhawke ответил: 28 апреля 2018 в 11:34

Простым способом является отображение карты памяти с помощью mmap(). Это позволяет вам манипулировать файлом как с кодом bytearray, так и с файлом. Изменения, внесенные в карту, отражаются в базовом файле.

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

import re
from mmap import mmapappend_string = b'\nhi there\n'with open('/tmp/hosts', "r+b") as f:
    with mmap(f.fileno(), 0) as m:
        match = re.search(rb'[\r\n]+$', m)
        append_pos = match.start() if match else m.size()
        m.resize(append_pos + len(append_string))
        m[append_pos:] = append_string

Возможно, вы захотите заменить пробел в конце файла, например строка может содержать пробелы. Если это изменить шаблон регулярного выражения на rb'\s+$'.

Вышеприведенный код должен работать в Unix. Возможно, вам понадобится возиться с вызовом mmap(), если вы используете другую платформу.

Для больших файлов, то есть тех, которые больше размера страницы, используемого mmap(), вы можете сделать это более эффективным, сканируя с конца карты для новых символов линии, чтобы определить положение в файле, из которого следует перезаписать.

Shirish Shukla ответил: 28 апреля 2018 в 10:14

Ищите режимы os.walk () и 'r +'.

Thom ответил: 28 апреля 2018 в 10:59

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

Следующий код должен делать трюк и читает весь файл и тем самым удаляет некоторую сложность циклов.

import os
directory = './test'for filename in os.listdir(directory):
    if filename.endswith(".txt"):
        clean = open(directory + "/" +filename).read().replace('\n', '')
        outfile = open(directory + "/" +filename, 'w')
        outfile.write(clean)
        outfile.close()
amac ответил: 28 апреля 2018 в 11:06
Попробуйте удалить \ n из конца файла, а не каждую строку. Спасибо :)