разделить текстовый файл с регулярным выражением python [duplicate]

Всякий раз, когда вы хотите использовать переменные переменные, вероятно, лучше использовать словарь. Поэтому вместо записи

$foo = "bar" $$foo = "baz"

вы пишете

mydict = {} foo = "bar" mydict[foo] = "baz"

Таким образом, вы не будете случайно перезаписывать ранее существовавшие переменные (что является аспектом безопасности), и вы можете иметь разные " Пространства имен».

118
задан starkeen 3 June 2015 в 14:30
поделиться

10 ответов

result = []
for line in text.splitlines():
    result.append(tuple(line.split(",")))
3
ответ дан Acid_Snake 21 August 2018 в 07:15
поделиться
  • 1
    Не могли бы вы добавить немного объяснения этому сообщению? Код только (иногда) хорош, но код и объяснение (чаще всего) лучше – Barranka 9 July 2014 в 21:29
  • 2
    Я знаю, что комментарий Барранки старше года, но для всех, кто наткнулся на это и не может понять: для строки в text.splitlines (): помещает каждую отдельную строку в переменную temp & quot; линия & Quot ;. line.split (& quot;, ") создает список строк, разделенных запятой. tuple (~) помещает этот список в кортеж, а append (~) добавляет его в результат. После цикла result представляет собой список кортежей, причем каждый кортеж содержит строку, а каждый элемент кортежа - элемент в файле csv. – Louis 18 October 2015 в 10:05

Далее приведен фрагмент кода, который использует модуль csv, но извлекает содержимое file.csv в список dicts, используя первую строку, которая является заголовком таблицы csv

import csv
def csv2dicts(filename):
  with open(filename, 'rb') as f:
    reader = csv.reader(f)
    lines = list(reader)
    if len(lines) < 2: return None
    names = lines[0]
    if len(names) < 1: return None
    dicts = []
    for values in lines[1:]:
      if len(values) != len(names): return None
      d = {}
      for i,_ in enumerate(names):
        d[names[i]] = values[i]
      dicts.append(d)
    return dicts
  return None

if __name__ == '__main__':
  your_list = csv2dicts('file.csv')
  print your_list
0
ответ дан Alexey Antonenko 21 August 2018 в 07:15
поделиться

Если вы уверены, что на вашем входе нет запятых, кроме как отделить категорию, вы можете прочитать строку строки по строке и split на , , затем нажмите результат на List

. Тем не менее, похоже, что вы смотрите на файл CSV, поэтому вы можете использовать модули для него

4
ответ дан Community 21 August 2018 в 07:15
поделиться

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

Будучи категорией и типом значения, я предпочитаю использовать тип словаря вместо списка кортежей.

В любом случае в приведенном ниже коде я показываю оба пути: d - словарь, а l - список кортежей.

import csv

file_name = "test.txt"
try:
    csvfile = open(file_name, 'rt')
except:
    print("File not found")
csvReader = csv.reader(csvfile, delimiter=",")
d = dict()
l =  list()
for row in csvReader:
    d[row[1]] = row[0]
    l.append((row[0], row[1]))
print(d)
print(l)
0
ответ дан Francesco Boi 21 August 2018 в 07:15
поделиться

Простой цикл будет достаточным:

lines = []
with open('test.txt', 'r') as f:
    for line in f.readlines():
        l,name = line.strip().split(',')
        lines.append((l,name))

print lines
2
ответ дан Hunter McMillen 21 August 2018 в 07:15
поделиться
  • 1
    Что делать, если некоторые из записей содержат в них запятые? – Tony Ennis 16 February 2016 в 18:59
  • 2
    @TonyEnnis Затем вам нужно будет использовать более продвинутый цикл обработки. Ответ Maciej выше показывает, как использовать парсер csv, который поставляется с Python для выполнения этой операции. Скорее всего, этот анализатор имеет всю необходимую логику. – Hunter McMillen 16 February 2016 в 19:21

Обновление для Python3:

import csv
from pprint import pprint

with open('text.csv', newline='') as file:
reader = csv.reader(file)
l = list(map(tuple, reader))
pprint(l)
[('This is the first line', ' Line1'),
('This is the second line', ' Line2'),
('This is the third line', ' Line3')]

Если csvfile является файловым объектом, его следует открыть с помощью newline=''. модуль csv

2
ответ дан JawSaw 21 August 2018 в 07:15
поделиться

Используйте модуль csv (Python 2.x):

import csv
with open('file.csv', 'rb') as f:
    reader = csv.reader(f)
    your_list = list(reader)

print your_list
# [['This is the first line', 'Line1'],
#  ['This is the second line', 'Line2'],
#  ['This is the third line', 'Line3']]

Если вам нужны кортежи:

import csv
with open('test.csv', 'rb') as f:
    reader = csv.reader(f)
    your_list = map(tuple, reader)

print your_list
# [('This is the first line', ' Line1'),
#  ('This is the second line', ' Line2'),
#  ('This is the third line', ' Line3')]

Python 3 .x (by @seokhoonlee ниже)

import csv

with open('file.csv', 'r') as f:
  reader = csv.reader(f)
  your_list = list(reader)

print(your_list)
# [['This is the first line', 'Line1'],
#  ['This is the second line', 'Line2'],
#  ['This is the third line', 'Line3']]
213
ответ дан Maciej Gol 21 August 2018 в 07:15
поделиться
  • 1
    Почему вы используете «rb» вместо «r»? – Drunken Master 21 May 2015 в 14:28
  • 2
    @DrunkenMaster, b заставляет файл открываться в двоичном режиме, а не в текстовом режиме. В некоторых системах текстовый режим означает, что \n будет конвертироваться в новую строку на платформе при чтении или записи. См. документы . – Maciej Gol 24 May 2015 в 08:12
  • 3
    Это не работает в Python 3.x: & quot; csv.Error: iterator должен возвращать строки, а не байты (вы открыли файл в текстовом режиме?) & Quot; См. Ниже ответ, который работает в Python 3.x – Gilbert 30 May 2016 в 18:12
  • 4
    @Gilbert, спасибо, обновил ответ. – Maciej Gol 31 May 2016 в 18:58
  • 5
    чтобы сэкономить несколько секунд отладки, вы, вероятно, должны добавить примечание к первому решению, например «версия Python 2.x». – paradite 30 January 2017 в 10:03

Pandas неплохо справляется с данными. Вот один пример, как использовать его:

import pandas as pd

# Read the CSV into a pandas data frame (df)
#   With a df you can do many things
#   most important: visualize data with Seaborn
df = pd.read_csv('filename.csv', delimiter=',')

# Or export it in many ways, e.g. a list of tuples
tuples = [tuple(x) for x in df.values]

# or export it as a list of dicts
dicts = df.to_dict().values()

Одно большое преимущество заключается в том, что pandas автоматически обрабатывает строки заголовков.

Если вы не слышали о Seaborn , я рекомендую посмотреть на него.

См. также: Как читать и писать CSV-файлы с помощью Python?

24
ответ дан Martin Thoma 21 August 2018 в 07:15
поделиться

Несколько увеличивая ваши требования и предполагая, что вас не интересует порядок строк и вы хотите их сгруппировать по категориям, для вас может работать следующее решение:

>>> fname = "lines.txt"
>>> from collections import defaultdict
>>> dct = defaultdict(list)
>>> with open(fname) as f:
...     for line in f:
...         text, cat = line.rstrip("\n").split(",", 1)
...         dct[cat].append(text)
...
>>> dct
defaultdict(<type 'list'>, {' CatA': ['This is the first line', 'This is the another line'], ' CatC': ['This is the third line'], ' CatB': ['This is the second line', 'This is the last line']})

Таким образом, вы получаете все соответствующие строки доступны в словаре под ключом, являющимся категорией.

1
ответ дан Marvin Cohen 21 August 2018 в 07:15
поделиться

Обновление для Python3:

import csv

with open('file.csv', 'r') as f:
  reader = csv.reader(f)
  your_list = list(reader)

print(your_list)
# [['This is the first line', 'Line1'],
#  ['This is the second line', 'Line2'],
#  ['This is the third line', 'Line3']]
26
ответ дан Ryan Romanchuk 21 August 2018 в 07:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: