2017-09-25 52 views
2

我已經尋找了很長時間的類似的問題,但找不到一個。從csv創建詞典只有1列中的所有數據

當我用Excel打開某個csv文件時,每行的數據都打包在一個單元格中,用「;」分隔,而不是多個單元格。第一行是字符串列表,其他所有行都是整數。我想用Python的第一行(字符串列表)作爲頭部來創建一個字典。 csv文件如下所示。我從一個機器學習數據庫中下載的文件datafile site

 col1 
row1 "x";"y";"z" 
row2 1;2;3 
row3 4;5;6 

當我使用

import csv 

new_list = [] 
with open(file) as f: 
    reader = csv.DictReader(f) 
    for row in reader: 
     new_list.append(row) 

print(new_list) 

我最終得到

{'"x";"y";"z"':'1;2;3'} 
{'"x";"y";"z"':'3;4;5'} 

,而不是

{'"x"':'1','"y"':'2','"z"':'3'} 
{'"x"':'4','"y"':'5','"z"':'6'} 

如何代碼我該做什麼?從這種類型的csv文件的字典? (當我有一個在Excel中打開的csv文件,其中所有的數據點都有它自己的單元格時,csv.DictReader類在製作字典時運行良好,但它不適用於這種類型的格式)

+0

這個問題困惑:是的' col1'部分文件?這與問題有關嗎?並且是'''''''是否有錯誤或錯誤的實際部分?另外,「一列中的所有數據」是什麼意思? –

+0

當我打開csv文件時,所有數據都在第一列。我認爲這是相關的,因爲當我打開其他每個數據點都有自己的列的csv文件時,我使用DictReader來獲取正常的字典。是的,這是一個錯字。所有數據都有「;」將其分開。我現在編輯它,所以它是正確的。 – zipline86

回答

-2

實際上您有多列。 的分隔符是逗號,

用途:

reader = csv.reader(f, delimiter=';') 

編輯:

你也許可以編寫自己的代碼:

with open('myfile.csv','r') as f: 
    headers = f.readline().split(';') # First line are headers 
    for line in f: 
     current_object = dict(zip(headers, line.split(';'))) # create a directory with headers and current line 
     print(current_object) 
+1

重新實現CSV解析器聽起來不是一個好主意;你可以在解析頭文件後使用Python的標準文件。 –

+0

@Clément你有沒有注意到我提供了兩種解決方案? –

+0

@Loïc剛剛注意到我無法使用reader = csv獲取解決方案1。閱讀器(f,分隔符「;」)的方式,但它在我做第二個解決方案時起作用。 row1是一個字符串列表,而不是一個長字符串與我爲什麼不能使用第一個解決方案有關? – zipline86

0

使用熊貓庫:

import io 
import pandas as pd 

txtfile = u"""col1 
"x","y","z" 
1,2,3 
4,5,6""" 

df = pd.read_csv(io.StringIO(txtfile),skiprows=1) 
df.T.to_dict().values() 

回報:

[{'x': 1, 'y': 2, 'z': 3}, {'x': 4, 'y': 5, 'z': 6}] 
2

簡單地跳過你的文件的第一行:

import csv 

with open(file) as f: 
    next(f, None) # skip first row 
    new_list = list(csv.DictReader(f)) 


print(new_list) 

或者,在複製品中:

>>> s = """col1 
... "x","y","z" 
... 1,2,3 
... 4,5,6 
... """ 
>>> import io 
>>> import csv 
>>> f = io.StringIO(s) 
>>> next(f) 
'col1\n' 
>>> list(csv.DictReader(f)) 
[{'y': '2', 'x': '1', 'z': '3'}, {'y': '5', 'x': '4', 'z': '6'}] 
>>> 
+0

我試着跳過第一行的代碼,它返回所有第2行作爲鍵和不同的行作爲值。我不想保留我的鑰匙的第一行嗎? – zipline86

相關問題