将csv文件读入列表并将字符串转换为整数Python

时间:2019-10-24 01:01:11

标签: python list csv

我正在尝试读取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]...]这样的列表

3 个答案:

答案 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