Я изучаю Python, но у меня нет большого опыта в программировании. Я пытаюсь построить подпрограмму для импорта файла CSV и итерации каждой строки, в которой есть определенный ключ, и объединить эти строки в одну строку.
Пример :
CSV-файл:
'0001','key1','name'
'0002','key1','age'
'0001','key2','name'
'0002','key2','age'
Полученный файл должен быть:
['0001','key1','name','0002','key1','age']
['0001','key2','name','0002','key2','age']
Как я могу этого добиться?
3 ответа
Прочтите CSV:
import csv
with open('my_csv.txt', 'rb') as f:
my_list = list(csv.reader(f))
На данный момент my_list, по-видимому, напоминает список списков, например, следующий:
[['0001', 'key1', 'name'], ['0002', 'key1', 'age'], ['0001', 'key2', 'name'], ['0002', 'key2', 'age']]
Создайте dict, где каждый ключ [число] из списков соответствует ключу в dict, а каждое значение в dict соответствует сцепленным спискам для определенного ключа:
dict_of_lists = {}
for item in my_list:
_, key, _ = item
if key in dict_of_lists.keys():
dict_of_lists[key] = dict_of_lists[key] + item
else:
dict_of_lists[key] = item
Если вам не важен порядок пунктов списка:
dict_of_lists.values()
Выход:
[['0001', 'key2', 'name', '0002', 'key2', 'age'], ['0001', 'key1', 'name', '0002', 'key1', 'age']]
Если вы заботитесь о заказе,
from collections import OrderedDict
OrderedDict(sorted(dict_of_lists.items())).values()
Выход:
[['0001', 'key1', 'name', '0002', 'key1', 'age'], ['0001', 'key2', 'name', '0002', 'key2', 'age']]
Предполагая, что ваш CSV-файл не содержит одинарные кавычки (и они только для представления здесь), это должно работать:
import pandas as pd
Data = pd.read_csv('Test.csv',header=None,dtype=str)
Result = Data.groupby(1).apply(lambda y: ','.join([s1 for s2 in y.values for s1 in s2]))
f = open('Result.csv','w')
for r in Result:
f.write(r+'\n')
f.close()
Вывод сохраняется в Result.csv
Если вы можете позволить себе хранить все записи в ОЗУ, то для этого можно использовать defaultdict для создания «блоков» записей по ключу (при этом предполагается, что файл называется file.csv):
from collections import defaultdict
#this defaultdict acts as a Python dictionary, but creates an empty list
# automatically in case the key doesn't exist
entriesByKey = defaultdict(list)
with open("file.csv") as f:
for line in f.readlines():
#strips trailing whitespace and splits the line into a list
# using "," as a separator
entry = line.rstrip().split(",")
#the key is the second field in each entry
key = entry[1]
#concatenate entry to its respective key 'bucket'
entriesByKey[key] += entry
#Now, we create a list of concatenated lines by key, sorting them
# so that the keys appear in order
out = [entriesByKey[key] for key in sorted(entriesByKey.keys())]
#pretty-print the output :-)
import pprint
pprint.pprint(out)
Выход для этой программы для вашего ввода будет:
[["'0001'", "'key1'", "'name'", "'0002'", "'key1'", "'age'"],
["'0001'", "'key2'", "'name'", "'0002'", "'key2'", "'age'"]]
Все, чего не хватает, - это обрезать одинарные кавычки для каждой записи (и, возможно, отформатировать вывод по своему вкусу вместо простого использования pprint()
). Если вы можете гарантировать, что ваши входные данные правильно сформированы и что поля последовательно содержат одинарные кавычки (или, точнее, что первый и последний символы для каждого поля в записи никогда не релевантны), вы можете сделать это, добавив следующее выше key = entry[1]
строка:
entry = [field[1:-1] for field in entry]
Это удалит первый и последний символы каждого поля.
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.