Что я делаю не так с этим скриптом чтения / записи файла? - PullRequest
0 голосов
/ 30 мая 2020

Этот сценарий предназначен для поиска файла, чтения файла и замены указанных вхождений. Например, в CMD я должен иметь возможность ввести python modify.py smbd.txt «password syn c = yes», «password syn c = no»

. Введя это в CMD, сценарий должен заменить все вхождения «password syn c = yes» в файле smbd.txt на «password syn c = no»

Однако у меня возникают проблемы с выполнением этого, поскольку я получаю ошибки при запуске кода. Мы не изучали это в классе, и я не знаю, как я должен уметь правильно писать сценарий. Мне просто кажется, что я что-то упускаю, возможно, что-то связано с чтением строк в txt-файле? Это то, что у меня есть. Любая помощь будет оценена.

ОШИБКА

Traceback (most recent call last):

File "modify.py", line 18, in <module>
    outFile.write(line.replace(searchText, replaceText))
AttributeError: 'str' object has no attribute 'write'
import sys

#get the command line arguments
if len(sys.argv) != 4:
    print("usage: modify.py fileSpec from to")
    exit(1)

fileSpec = sys.argv[1]; # read file name first arg
searchText = sys.argv[2]; # text to search for
replaceText = sys.argv[3]; # text to replace with

outFile = fileSpec + '.new' # write file = read file with .new append
outPointer = open(outFile, 'w') # open write file
inPointer = open(fileSpec, 'r') # open read file

for line in fileSpec:
    #foreach line replace the strings
    outFile.write(line.replace(searchText, replaceText))
fileSpec.close()
outFile.close()

1 Ответ

1 голос
/ 30 мая 2020

Проблема в том, что outFile и fileSpec - это просто строки, и вы пытаетесь писать или читать в них. Вам нужно использовать outPointer и inPointer, дескрипторы файлов, которые вы предположительно создали для этой цели. И предпочтительно в диспетчере контекста, например:

with open(outFile, 'w') as outPointer:
    with open(fileSpec, 'r') as inPointer:
        for line in inPointer
            outPointer.write(line.replace(searchText, replaceText))
            outPointer.write('\n')   # If you want each line from the input
                                     # to be on its own line in the output

Используя диспетчер контекста with open(...), вам не нужно беспокоиться о вызове .close(), это делается за вас. В основном вам просто нужно четко разделять строки и ручки файлов и использовать их по назначению.

Надеюсь, что это поможет, удачного кодирования!

...