2015-12-15 91 views
0

我正在學習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_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']] 

如果你關心的順序:

​​

輸出:

[['0001', 'key1', 'name', '0002', 'key1', 'age'], ['0001', 'key2', 'name', '0002', 'key2', 'age']] 
1

如果你可以負擔得起在RAM中存儲所有條目,使用defaultdict按鍵創建'bucket'條目將是一種方法(假設一個名爲'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] 

這將剝離每個字段的第一個和最後一個字符。

0

假設您的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