Я пытаюсь создать функцию, которая читает CSV-файлы без модуля CSV, но сталкиваюсь с ошибкой форматирования

#python #string #csv #formatting

#python #строка #csv #форматирование

Вопрос:

В качестве средства практического форматирования я пытаюсь отформатировать файл CSV в интерпретируемые списки без модуля CSV. Код, который я написал до сих пор, выглядит следующим образом:

 def formatting(filename):
"""Format the data in interpretable lists"""
data = [] #defining the list of data

with open(filename, 'r') as f:
    for line in f:
        i = 0
        while line[i] != ' ':
            temp = [] #defining placeholder list for line data to be stored in
            strip = '' #defining placeholder list element
            while line[i] != ',': #filling placeholder list element
                strip[i]  = line[i]
                i  = 1
            temp.append(strip)
        data.append(temp)
  

Из-за чего я сталкиваюсь с ошибкой индексации:

 strip[i]  = line(i)
IndexError: string index out of range
  

Я не уверен, почему это не работает. Я предполагаю, что это должно быть потому, что strip начинается с пустого и, следовательно, на самом деле не имеет индекса для начала, поэтому я бы предпочел кодировать функцию, аналогичную функции добавления списков (просто: добавьте i-ю букву строки в строку strip). Некоторая помощь была бы очень кстати! 🙂

Комментарии:

1. strip = '' это строка нулевой длины, поэтому это strip[i] не сработает. Обновите свой пост с помощью примера ввода и ожидаемого результата

2. split line переменная с delimiter

Ответ №1:

Возможно, это отправная точка для получения того, что вы хотите?

 def formatting(filename):
    """Format the data in interpretable lists"""
    data = []  # defining the list of data
    with open(filename, 'r') as f:
        for line in f:
            data.append(line.strip().split(','))
    return data
  

Ответ №2:

Эта ошибка связана с тем, что strip[i] where strip является пустой строкой и i равна 0.

В вашей текущей логике перебора символов необходимо внести некоторые исправления, особенно в отношении того, как определить конец строки и где temp следует инициализировать с помощью empty list, чтобы это сработало. Пожалуйста, обратитесь к приведенному ниже коду.

 def formatting(filename):
    """Format the data in interpretable lists"""
    data = [] #defining the list of data

    with open(filename, 'r') as f:
        for line in f:
            if line.strip()!='':
                i = 0
                temp = [] #defining placeholder list for line data to be stored in
                while i<len(line):
                    strip = '' #defining placeholder list element
                    while i<len(line) and line[i] not in  [',','n']: #filling placeholder list element
                        strip  = line[i]
                        i  = 1
                    temp.append(strip)
                    i =1
                data.append(temp)
    return data
    
print(formatting("test.csv"))
  

Если вам может потребоваться альтернатива без модуля csv, попробуйте приведенный ниже код.
Это делает то же самое, что и приведенный выше код, но вместо перехода от символа к символу использует split() функцию.

 def formatting(filename):
    with open(filename,"r") as f:
        return [line.split(",") for line in f.read().splitlines() if line]
    
print(formatting("test.csv"))