我正在尝试读取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]...]
这样的列表
答案 0 :(得分:0)
之所以发生这种情况,是因为python3正在以二进制形式读写文件。因此,您可以将字节数据转换为字符串并继续操作,也可以使用熊猫读取数据,这些数据通常会将您的数字读取为整数。
import pandas as pd
df = pd.read_csv("filename")
rows = df.values.tolist()
Pandas使您有更多的自由来对行执行操作。您还可以使用类似下面的方法将列的数据类型转换为int
df[column_name]=df[column_name].astype(int)
答案 1 :(得分:0)
这是因为您在另一个列表中有一个列表。 就像您告诉我们的一样:
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]
@edit
如果要使用值列表列表作为输入,则下面的代码将起作用。
outer_out_list = []
for inner_list in dataList:
innet_out_list = []
for string in inner_list:
innet_out_list.append(int(string))
outer_out_list.append(innet_out_list)
输出:
[[123, 234, 456, 567], [345, 3456, 5678, 678], [2345, 4567, 45678, 56789]]
答案 2 :(得分:0)
@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
,而不是试图将整行(记录,即{ {1}}合并为一个list
。