Python: удаление определенных строк из файла - PullRequest
2 голосов
/ 09 сентября 2011

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

Вот что я делаю, но безрезультатно:

infile = r"messy_data_file.txt"
outfile = r"cleaned_file.txt"

delete_list = ["firstname1 lastname1","firstname2 lastname2"....,"firstnamen lastnamen"]
fin=open(infile,"")
fout = open(outfile,"w+")
for line in fin:
    for word in delete_list:
        line = line.replace(word, "")
    fout.write(line)
fin.close()
fout.close()

Когда я запускаю файл, я получаю следующую ошибку:

NameError: name 'word' is not defined

Пожалуйста, помогите!

Ответы [ 4 ]

10 голосов
/ 09 сентября 2011

Метод readlines возвращает список строк , а не слов, поэтому ваш код будет работать только в том случае, если одно из ваших слов находится на отдельной строке.

Поскольку файлы являются итераторами над строками, это можно сделать намного проще:

infile = "messy_data_file.txt"
outfile = "cleaned_file.txt"

delete_list = ["word_1", "word_2", "word_n"]
fin = open(infile)
fout = open(outfile, "w+")
for line in fin:
    for word in delete_list:
        line = line.replace(word, "")
    fout.write(line)
fin.close()
fout.close()
1 голос
/ 31 января 2017

К ОП, Метод Росса Паттерсона, описанный выше, прекрасно работает для меня, т. Е.

infile = "messy_data_file.txt"
outfile = "cleaned_file.txt"

delete_list = ["word_1", "word_2", "word_n"]
fin = open(infile)
fout = open(outfile, "w+")
for line in fin:
    for word in delete_list:
        line = line.replace(word, "")
    fout.write(line)
fin.close()
fout.close()

Пример:

У меня есть файл с именем messy_data_file.txt, который включает следующие слова (животные), не обязательно в одной строке. Как это:

Goat
Elephant
Horse Donkey Giraffe
Lizard
Bird
Fish

Когда я изменяю код для чтения (фактически просто добавляя слова для удаления в строку «delete_list»):

infile = "messy_data_file.txt"
outfile = "cleaned_file.txt"

delete_list = ["Donkey", "Goat", "Fish"]
fin = open(infile)
fout = open(outfile, "w+")
for line in fin:
    for word in delete_list:
       line = line.replace(word, "")
    fout.write(line)
fin.close()
fout.close()

Результирующий «cleaned_file.txt» выглядит так:

Elephant
Horse  Giraffe
Lizard
Bird

Есть пустая строка, где раньше был "Козел" (где, как ни странно, удаление "Осла" не было), но для моих целей это прекрасно работает.

Я также добавляю input («Нажмите Enter, чтобы выйти ...») в самом конце кода, чтобы окно командной строки не открывалось и не захлопывало меня, когда я дважды щелкните файл remove_text.py, чтобы запустить его, но учтите, что при этом вы не обнаружите ошибок.

Для этого я запускаю его из командной строки (где C: \ Just_Testing - это каталог, в котором находятся все мои файлы, то есть, remove_text.py и messy_text.txt) как это:

C:\Just_Testing\>py remove_text.py 

или

C:\Just_Testing>python remove_text.py 

работает точно так же.

Конечно, как и при написании HTML, я полагаю, что никогда не помешает использовать полный путь при запуске py или python не из каталога, в котором вы находитесь, например:

C:\Windows\System32\>python C:\Users\Me\Desktop\remove_text.py

Конечно, в коде это будет:

infile = "C:\Users\Me\Desktop\messy_data_file.txt"
outfile = "C:\Users\Me\Desktop\cleaned_file.txt"

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

Лично у меня есть переменная PATH в моих переменных среды, установленная для указания на все мои установки Python, то есть C: \ Python3.5.3, C: \ Python2.7.13 и т. Д., Поэтому я могу запускать py или python из любого места.

В любом случае, я надеюсь, что точная настройка этого кода мистером Паттерсоном поможет вам получить именно то, что вам нужно. :)

.

1 голос
/ 17 октября 2015

Чтобы удалить строку в том же файле, я использовал этот код

f = open('./test.txt','r')
a = ['word1','word2','word3']
lst = []
for line in f:
    for word in a:
        if word in line:
            line = line.replace(word,'')
    lst.append(line)
f.close()
f = open('./test.txt','w')
for line in lst:
    f.write(line)
f.close()
1 голос
/ 09 сентября 2011

На основании вашего комментария "Я дважды щелкаю по файлу .py. Кажется, он вызывает приложение python, которое исчезает через пару секунд. Я не получаю никакой мысли об ошибке" Я считаю, что ваша проблема в том, что скрипт не находит входной файл. Вот почему вы не получаете никакой информации. Когда вы дважды щелкаете по нему ... Я на самом деле не могу вспомнить, где будет выглядеть интерпретатор, но я думаю, что именно там установлен python.exe.

Используйте полный путь, подобный этому.

# Depends on your OS
infile = r"C:\tmp\messy_data_file.txt"
outfile = r"C:\tmp\cleaned_file.txt"

infile = r"/etc/tmp/messy_data_file.txt"
outfile = r"/etc/tmp/cleaned_file.txt"

Кроме того, для вашего здравого смысла, запустите его из командной строки вместо двойного щелчка. Будет намного легче ловить ошибки / вывод.

...