2017-02-20 3 views
0

Я использую Windows 7.0 и имею Python 3.4. Я очень новичок в Python. Вот мой список. Это файл цены. У меня есть тысячи из них, но сейчас я пытаюсь заставить его работать только на одном.Извлечение строк из текстового файла на основе первого столбца для текста в Python

Я пытаюсь извлечь только строки, начинающиеся с hfus, ious или oaus.

caus 123456 99.872300000  2 
gous 1234567 99.364200000  2 
oaus 891011 97.224300000  2 
ious 121314 96.172800000  2 
hfus 151617 99081.00   2 
hfus 181920 1.000000000   2 

Желаемый результат.

oaus 891011 97.224300000  2 
ious 121314 96.172800000  2 
hfus 151617 99081.00   2 
hfus 181920 1.000000000   2 

Вот что я написал до сих пор, но он не работает. Я также хотел бы, чтобы он прокручивал каждый файл и перезаписывал существующий файл с усеченным списком, сохраняя его с его оригинальным именем. Файл 033117.txt представляет дату. Каждый файл сохраняется как mmddyy.txt. Приобретение его для работы над всеми файлами было бы идеальным, но на данный момент, если я могу заставить его работать над одним файлом, это было бы неплохо.

inFile = open("033117.txt") 
outFile = open("result.txt", "w") 
buffer = [] 
keepCurrentSet = True 
for line in inFile: 
    buffer.append(line) 
    if line.startswith("hfus"): 
     if line.startswith("oaus"): 
      if line.startswith("ious"): 
     if keepCurrentSet: 
      outFile.write("".join(buffer)) 
     keepCurrentSet = True 
     buffer = [] 
    elif line.startswith(""): 
     keepCurrentSet = False 
inFile.close() 
outFile.close() 
+0

в петле, попробуйте 'beginning_line = line.split() [0]', а затем вы можете сделать чек с 'если 'oaus' в beginning_line' ... Плюс я предлагаю открыть файлы с помощью 'with' – fedepad

+0

' if line.split() [0] in ('hfus', 'ious', 'oaus'): #do stuff' – TheClonerx

ответ

1

Я предлагаю использовать инструкцию with при открытии файловых объектов, поэтому вам не нужно явно закрывать файл, он будет автоматически закрыт для вас, когда выйдет изъятый ​​блок.
Чтение и фильтрации из файла и записи результатов в другой файл (не переписывая тот же файл) может быть достигнуто с помощью list comprehension и выбора соответствующих линий, что дает более лаконичный способ для выполнения этой задачи:

with open("033117.txt", 'rt') as inputf, open("result.txt", 'wt') as outputf:  
    lines_to_write = [line for line in inputf if line.split()[0] in ("hfus", "ious", "oaus")] 
    outputf.writelines(lines_to_write) 

Если вы хотите перезаписать файл, вместо того, чтобы открыть новый дополнительный файл и записать в него, сделайте следующее:

with open('033117.txt', 'r+') as the_file: 
    lines_to_write = [line for line in the_file if line.split()[0] in ("hfus", "ious", "oaus")] 
    the_file.seek(0) # just to be sure you start from the beginning (but it should without this...) 
    the_file.writelines(lines_to_write) 
    the_file.truncate() 

Смотрите open, modes для открытых мод эс.

+0

Ваш первый пример работает, но перезаписывать экзамены нет. Файл «read.py», строка 3, в begin_line = line.split() [0] NameError: имя 'строка' не определено PS I: \ py> –

+0

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

+0

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

0

Попробуйте этот запрос:

inFile = open("033117.txt") 
outFile = open("result.txt", "w") 
for line in inFile.readlines(): 
    if line.startswith("hfus"): 
     outFile.write(line) 
    if line.startswith("oaus"): 
     outFile.write(line) 
    if line.startswith("ious"): 
     outFile.write(line) 
inFile.close() 
outFile.close() 

Даже новичок в Python, так что может быть много лучше решения, но это должно работать.

0

Для этого вида обработки данных я предлагаю использовать pandas

import pandas as pd 
df = pd.read_csv("033117.txt", header=None, names=['foo','bar','foobar','barfoo']) 
df = df[df.foo.isin(['hfus','oaus'])] 
df.to_csv("result.txt") 

Конечно, вы хотите использовать более содержательного заголовок значение ;-)

1
with open('033117.txt') as inFile, open('result.txt', 'w') as outFile: 
    for line in inFile: 
     if line.split()[0] in ('hfus', 'ious', 'oaus'): 
      outFile.write(line) 
0

Попробуйте использовать with заявление, чтобы открыть ваш вместо outFile = open(). Это должно помочь создать меньше ошибок :)

with open('033117.txt') as inFile, open('result.txt', 'w') as outFile: 
    for line in inFile: 
     if line.split()[0] in ('hfus', 'ious', 'oaus'): 
      outFile.write(line) 
+0

Это действительно работает, но моя настоящая цель - перезаписать исходный файл. –

Смежные вопросы