Чтение файла CSV в список и преобразование строк в целые числа Python - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь прочитать файл CSV, а затем возвращает все данные в список. Сначала я попытался прочитать в файле csv, используя csv.reader, используя следующий код:

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 голосов
/ 24 октября 2019

Это потому, что у вас есть один список внутри другого. Как вы сказали нам:

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]]
0 голосов
/ 24 октября 2019

Ответ @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.

0 голосов
/ 24 октября 2019

Это происходит потому, что python3 читает и записывает файлы в двоичном формате. Таким образом, вы можете либо преобразовать байтовые данные в строку и продолжить, либо использовать pandas для чтения данных, которые в основном будут читать ваши числа как целые числа.

import pandas as pd

df = pd.read_csv("filename")

rows = df.values.tolist()

Pandas дает вам больше свободы для выполнения операций со строками. Вы также можете использовать что-то вроде ниже, чтобы преобразовать тип данных столбца в int

df[column_name]=df[column_name].astype(int)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...