[英]Extracting variable names and data from csv file using Python
我有一個csv文件,該文件的每一行均以行名格式化,后跟11條數據。 這是一條線的示例。
CW1,0,-0.38,2.04,1.34,0.76,1.07,0.98,0.81,0.92,0.70,0.64
總共有12行,每行都有唯一的名稱和數據。
我想做的是從每一行中提取第一個單元格,並用它來命名相應的數據,或者作為等於包含該行數據的列表的變量,或者作為字典,以第一個單元格為鍵。
我是輸入文件的新手,所以我最了解的是使用文檔中的庫存解決方案閱讀文件
import csv
path = r'data.csv'
with open(path,'rb') as csvFile:
reader = csv.reader(csvFile,delimiter=' ')
for row in reader:
print(row[0])
我無法弄清楚如何將每一行分配給一個新變量,尤其是當我不確定變量名將是什么時(這是因為csv文件將由我自己以外的用戶創建)。
該數據的目的地是我編寫的工具。 它接受列表作為輸入,例如...
CW1 = [0,-0.38,2.04,1.34,0.76,1.07,0.98,0.81,0.92,0.70,0.64]
因此這將是理想的最終解決方案。 如果更容易並且以其他格式讀取文件的輸出被認為更好,我當然可以重寫我的工具以使用該數據類型。
您需要對這類事物(動態變量)使用dict
:
import csv
path = r'data.csv'
data = {}
with open(path,'rb') as csvFile:
reader = csv.reader(csvFile,delimiter=' ')
for row in reader:
data[row[0]] = row[1:]
dicts
對於動態變量特別有用,並且是存儲此類內容的最佳方法。 訪問您只需要使用:
data['CW1']
該解決方案還意味着,如果您在其中添加了其他帶有新名稱的行,則無需進行任何更改。
如果您迫切希望將變量名放在global namespace
而不是在dict
,請使用exec
(注意,如果從外部源輸入的任何這些用途,使用EXEC
/ EVAL
非常危險( rm *
級),因此請確保所有輸入由您自己控制和理解)。
with open(path,'rb') as csvFile:
reader = csv.reader(csvFile,delimiter=' ')
for row in reader:
exec("{} = {}".format(row[0], row[1:])
正如Scironic在回答中所說的那樣,最好對此類事情使用dict
。
但是,請注意dict
對象沒有任何“順序”-如果使用一個,則行的順序將丟失。 如果這是一個問題,則可以改用OrderedDict
(聽起來就是這樣:“記住”其內容順序的dict
):
import csv
from collections import OrderedDict as od
data = od() # ordered dict object remembers the order in the csv file
with open(path,'rb') as csvFile:
reader = csv.reader(csvFile, delimiter = ' ')
for row in reader:
data[row[0]] = row[1:] # Slice the row up into 0 (first item) and 1: (remaining)
現在,如果您遍歷data
對象,其內容將與csv文件中的順序相同:
for d in data.values():
myspecialtool(*d)
在python中,您可以使用切片: row[1:]
將包含除第一個元素以外的行,因此您可以執行以下操作:
>>> d={}
>>> with open("f") as f:
... c = csv.reader(f, delimiter=',')
... for r in c:
... d[r[0]]=map(int,r[1:])
...
>>> d
{'var1': [1, 3, 1], 'var2': [3, 0, -1]}
關於變量變量,請檢查如何在Python中執行變量變量? 或如何在Python中獲取變量名稱作為字符串? 。 我會堅持字典。
使用適當的csv庫的替代方法如下:
path = r'data.csv'
csvRows = open(path, "r").readlines()
dataRows = [[float(col) for col in row.rstrip("\n").split(",")[1:]] for row in csvRows]
for dataRow in dataRows: # Where dataRow is a list of numbers
print dataRow
然后,您可以在print語句所在的位置調用函數。
這將讀取整個文件,並生成帶有尾隨換行符的行列表。 然后,它刪除每個換行符並將每一行拆分為一個字符串列表。 它跳過初始列,並為每個條目調用float()。 產生列表列表。 這取決於第一列的重要性嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.