Я изучаю 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']

Как я могу этого добиться?

0
CaeBrida 15 Дек 2015 в 04:53

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']]
3
Boa 15 Дек 2015 в 03:44

Предполагая, что ваш 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

0
JavNoor 15 Дек 2015 в 03:46

Если вы можете позволить себе хранить все записи в ОЗУ, то для этого можно использовать 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]

Это удалит первый и последний символы каждого поля.

1
Marco Kawajiri 15 Дек 2015 в 03:33