Прочитайте все текстовые файлы в папке и измените символ в строке, если он представлен - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть папка с документами в формате csv с расширением .arw.Файлы называются 1.arw, 2.arw, 3.arw ... и т. Д.

Я хотел бы написать код, который считывает все файлы, проверяет и заменяет прямую черту / на тире -.И, наконец, создает новые файлы с замененным символом.

Код, который я написал следующим образом:

for i in range(1,6):
    my_file=open("/path/"+str(i)+".arw", "r+")
    str=my_file.read()

    if "/" not in str:
        print("There is no forwardslash")
    else:
        str_new = str.replace("/","-")
        print(str_new)

        f = open("/path/new"+str(i)+".arw", "w")
        f.write(str_new)
        my_file.close()

Но я получаю сообщение об ошибке:

'strОбъект не может быть вызван.

Как я могу заставить его работать для всех файлов в папке?Видимо, мой цикл for не работает.

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Фактическая ошибка заключается в том, что вы заменяете встроенную str на собственную переменную с тем же именем, а затем пытаетесь использовать встроенную str().

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

import logging
import os

for i in range(1,6):
    seen_slash = False
    input_filename = "/path/"+str(i)+".arw"
    output_filename = "/path/new"+str(i)+".arw"
    with open(input_filename, "r+") as input, open(output_filename, "w") as output:
        for line in input:    
           if not seen_slash and "/" in line:
               seen_slash = True
            line_new = line.replace("/","-")
            print(line_new.rstrip('\n')) # don't duplicate newline
            output.write(line_new)
    if not seen_slash:
        logging.warn("{0}: No slash found".format(input_filename))
        os.unlink(output_filename)

Использование logging вместо print для сообщений об ошибках помогает, потому что вы сохраняете стандартный вывод(вывод print) отдельно от диагностики (вывод logging).Обратите также внимание на то, как диагностическое сообщение включает в себя имя файла, в котором мы обнаружили проблему.

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

0 голосов
/ 16 ноября 2018

Вот как бы я это сделал:

for i in range(1,6):
    with open((str(i)+'.arw'), 'r') as f:
        data = f.readlines()

        for element in data:
            element.replace('/', '-')
        f.close()
    with open((str(i)+'.arw'), 'w') as f:
        for element in data:
            f.write(element)
        f.close()

это предполагает из вашего поста, что вы знаете, что у вас есть 6 файлов

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

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