#python #file #indexing #output #txt
Вопрос:
Мне интересно, как лучше всего удалить строки из табличного текста (сохранив заголовок), чтобы только определенные записи, содержащие слово, были в табличном формате.
Скажем, например, у меня есть табличный текстовый файл с животными, их именами и возрастом. (Заголовки-Животные/Имена/Возраст.) Как я могу удалить все строки, в которых нет слова «Собака» в заголовке «Животное»?
Имена животных Возраст
Пес Пиппин 10
Собака Веселая 14
Пес Фродо 12
Кот Саурон 11
Птица Гэндальф 10
Птица Мордор 12
и я хочу только: Имена животных Возраст
Пес Пиппин 10
Собака Веселая 14
Пес Фродо 12
У меня есть пример кода ниже с примечаниями:
import os headers = 1 field1 = 'ANIMALS' sep = ' ' def getIndex(delimString, delimiter, name): '''Get position of item in a delimited string''' delimString = delimString.strip() lineList = delimString.split(delimiter) index = lineList.index(name) return index infile = 'C:/example' outfile = 'C:/folder/animals' try: with open(infile, 'r') as fin: with open(outfile, 'w') as fout: for i in range(headers): line = fin.readline() fout.write(line) line = fin.readline() fout.write(line) # This is where I get confused, I try using the method below: for line in fin: lineList = line.split(sep) # But the code doesn't work as it only prints the header # I have a feeling it's the way I'm phrasing this area if field1 == 'DOG': fout.write(line) print '{0} created.'.format(outfile) except IOError: print "{0} doesn't exist- send help".format(infile)
Каков наилучший способ выборочной печати элементов в табличном файле .txt?
Комментарии:
1. Это может быть только файл .txt или файл .csv?
2. Было бы полезно включить данные в код вместо жестких путей кодирования, которых у нас нет. В остальном хорошая работа по включению как данных, так и кода. В табличном формате это выглядит так, как будто вам нужны значения, разделенные пробелами, и новые записи, разделенные строками.
3. Я думаю, это может быть файл txt или CSV, любой из них работает. И я только пишу пример с приведенным выше кодом в табличный текст выше, потому что я создавал свои собственные подсказки.
4. В своем коде вы разделяете каждую строку на
lineList
, но затем продолжаете проверять некоторую переменнуюfield1
, которую вы определили'ANIMALS'
как — так'ANIMALS' == 'DOG'
как никогдаTrue
, никакие другие строки не записываются. Вместоif lineList[0] == 'DOG':
этого было бы то, что вам нужно.
Ответ №1:
Использование stdin и stdout вместо файлов для упрощения (вы можете заменить это на open, если хотите):
import sys headers = 1 sep = ' ' fin = sys.stdin fout = sys.stdout for i in range(headers): line = fin.readline() fout.write(line) for line in fin: lineList = line.split(sep) if lineList[0] == 'Dog': fout.write(line)
и когда вы запускаете это с:
python filter.py lt; input.txt Animals Names Ages Dog Pippin 10 Dog Merry 14 Dog Frodo 12
Другими словами, просто не печатайте то, что вам не нужно.
Ответ №2:
Предположим, что это csv-файл, с помощью этого кода вы можете возвращать только строки, в которых значение Dog как Animals
import pandas as pd df = pd.read_csv(file_name) df.loc[df.Animals == 'Dog']
Если вы хотите обновить файл, который вы можете запустить df.to_csv(filename)
, и он заменит файл csv с тем же именем файла, в противном случае он создаст другой файл csv с именем файла.
Я надеюсь, что это вам помогло.
Комментарии:
1. Крошечная задача, огромная зависимость!