В python, как вы можете удалить строки в табличном текстовом формате, которые НЕ содержат определенного слова?

#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. Крошечная задача, огромная зависимость!