簡體   English   中英

Python將整數從csv文件讀取到列表中

[英]Python reading in integers from a csv file into a list

在此處輸入圖片說明 我在嘗試將csv文件中的特定列讀入Python列表時遇到一些麻煩。 以下是我的csv文件的示例:

Col 1       Col 2
1,000,000   1
  500,000   2
  250,000   3

基本上,我想將第1列作為整數添加到列表中,這樣做很麻煩。 我努力了:

for row in csv.reader(csvfile):
    list = [int(row.split(',')[0]) for row in csvfile]

但是,我得到一個ValueError,上面寫着“以10為底的int()無效文字:'“ 1

然后,我嘗試:

for row in csv.reader(csvfile):
    list = [(row.split(',')[0]) for row in csvfile]

這次我沒有收到錯誤,但是得到了以下列表:

['"1', '"500', '"250']

我也嘗試過更改定界符:

for row in csv.reader(csvfile):
    list = [(row.split(' ')[0]) for row in csvfile]

這幾乎給了我所需的列表,但是該列表包括第二列以及每個值后的“ \\ n”:

['"1,000,000", 1\n', etc...]

如果有人可以幫助我解決此問題,將不勝感激!

干杯

您可以打開文件並使用正則表達式在空格處分割:

import re
file_data = [re.split('\s+', i.strip('\n')) for i in open('filename.csv')]
final_data = [int(i[0]) for i in file_data[1:]]

您應該明智地選擇定界符:如果使用,則有浮點數. ,使用,定界符,或者如果使用,則為浮點數,請使用; 作為分隔符。

此外,正如csv.reader的文檔所引用的csv.reader您可以使用delimiter=參數來定義您的分隔符,如下所示:

with open('myfile.csv', 'r') as csvfile:
    mylist = []
    for row in csv.reader(csvfile, delimiter=';'):
        mylist.append(row[0]) # careful here with [0]

或簡短版本:

with open('myfile.csv', 'r') as csvfile:
    mylist = [row[0] for row in csv.reader(csvfile, delimiter=';')]

要將您的數字解析為浮點數,您必須

 float(row[0].replace(',', ''))

首先,您必須正確解析數據。 因為實際上它不是CSV(逗號分隔值),而是TSV(制表符分隔),您應該通知CSV閱讀器(我假設它是制表符,但理論上您可以通過一些調整使用任何空白):

for row in csv.reader(csvfile, delimiter="\t"):

第二,您應該去除所有逗號的整數值,因為它們不會添加新信息。 之后,可以使用int()輕松解析它們:

int(row[0].replace(',', ''))

第三,您真的不應該重復兩次相同的列表。 使用列表推導普通的for循環,不要同時使用相同的變量。 例如,使用列表理解:

csvfile = StringIO("Col 1\tCol 2\n1,000,000\t1\n500,000\t2\n250,000\t3\n")
reader = csv.reader(csvfile, delimiter="\t")
next(reader, None)  # skip the header
lst = [int(row[0].replace(',', '')) for row in reader]

或使用常規迭代:

csvfile = StringIO("Col 1\tCol 2\n1,000,000\t1\n500,000\t2\n250,000\t3\n")
reader = csv.reader(csvfile, delimiter="\t")
lst = []
for i, row in enumerate(reader):
    if i == 0:
        continue  # your custom header-handling code here
    lst.append(int(row[0].replace(',', '')))

在這兩種情況下, lst都應設置為[1000000, 500000, 250000] 請享用。

順便說一句,使用保留關鍵字list作為變量是一個非常糟糕的主意。

UPDATE。 我發現另外一個有趣的選擇。 不用顯式設置定界符,您可以使用csv.Sniffer進行檢測,例如:

csvdata = "Col 1\tCol 2\n1,000,000\t1\n500,000\t2\n250,000\t3\n"
csvfile = StringIO(csvdata)
dialect = csv.Sniffer().sniff(csvdata)
reader = csv.reader(csvfile, dialect=dialect)

然后就像上面的片段一樣 即使您用分號或逗號替換制表符(可能需要在您的怪異整數周圍加上引號)或可能還有其他內容,這也將繼續起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM