我正在尝试读取CSV文件,然后将所有数据返回到列表中。我首先尝试使用以下代码通过csv.reader
读取csv文件:
import csv
with open(fileName, 'r') as f:
next(f)
data = csv.reader(f)
dataList = list(data)
而且我现在有一个看起来像这样的列表:
[['123', '234', '456', '567']
['345', '3456', '5678', '678']
['2345', '4567', '45678', '56789']
...]
[我注意到数字在列表中存储为字符串,所以我通过newList = [int(i) for i in dataList]
创建了一个新列表,并收到了此错误消息TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'
所以我尝试了在YouTube上看到的以下代码:
with open('fileName', 'r') as f:
next(f)
data = csv.reader(f)
data_lst = []
for line in reader:
data_lst.append([int(line)])
并且我收到此错误消息:
ValueError Traceback (most recent call last)
<ipython-input-123-9fbefdb892ab> in <module>
3 data = csv.reader(f)
4 data_lst = []
----> 5 for line in reader:
6 data_lst.append([int(line)])
ValueError: readline of closed file
有人知道如何将列表中的字符串转换为整数吗?
非常感谢!
示例csv文件
number1 number2 number3 number4
0 123 456 567 5678
1 4567 3456 6789 2345
....
我需要读取此csv文件并将其存储在列表中,以便csv文件中的每一行都是一个类似于[[123, 456, 567, 5678], [4567, 3456, 6789, 2345]...]
的列表
之所以这样,是因为python3正在以二进制形式读写文件。因此,您可以将字节数据转换为字符串并继续,或者使用熊猫读取数据,这些数据通常会将您的数字读取为整数。
import pandas as pd
df = pd.read_csv("filename")
rows = df.values.tolist()
Pandas使您有更多的自由来对行执行操作。您也可以使用类似下面的方法将列的数据类型转换为int
df[column_name]=df[column_name].astype(int)
这是因为您在另一个列表中有一个列表。就像您告诉我们的一样:
dataList = [['123', '234', '456', '567'],['345', '3456', '5678', '678'],['2345', '4567', '45678', '56789']]
在您的代码中,您正在内部列表上进行迭代,因此您只需要在内部列表内的字符串上进行迭代。像这样:
int_list = []
for inner_list in dataList:
for string in inner_list:
int_list.append(int(string))
或单行:
int_list = [int(string) for inner_list in dataList for string in inner_list]
将在下面显示输出:
[123, 234, 456, 567, 345, 3456, 5678, 678, 2345, 4567, 45678, 56789]
提供的答案@brunoto是正确的,我希望此解决方案(更接近您的解决方案:]
with open('fileName', 'r') as f:
next(f)
data = csv.reader(f)
data_lst = []
for line in reader:
data_lst.append([int(x) for x in line])
请注意,所需要做的只是更改最后一行,遍历每行的元素并将它们分别转换为int
,而不是尝试翻整行(一条记录,即list
)成单个int
。