Я не могу рекурсивно читать строки .csv. Почему это показывает мне ошибку: IndexError: list index out of range?

def kmlForLab2(x,y):
    #XYpoints1_wgs84
    #XYpoints1_wgs84.csv
    print(x,y)
    
    #Input the file name."JoeDupes3_forearth"
    fname = input("Enter file name WITHOUT extension: ")
    data = csv.reader(open(fname + '.csv'), delimiter = ',')
    
    #Skip the 1st header row.
    #data.next()
    #Open the file to be written.
    f = open('Buffered_kml.kml', 'w')
    
    #Writing the kml file.
    f.write("<?xml version='1.0' encoding='UTF-8'?>\n")
    f.write("<kml xmlns='http://earth.google.com/kml/2.0'>\n")
    f.write("<Document>\n")
    f.write("<!-- first buffer -->")
    f.write("<Placemark>\n")
    f.write("   <name>" + fname + '.kml' +"</name>\n")
    f.write("   <Polygon> <outerBoundaryIs> <LinearRing>\n")
    f.write("           <coordinates>\n" )
    next(data)
    for row in data:
        #every_row = (', '.join(row))
        f.write(str(( row[x])) + "," + (str( row[y]))+ "\n") 
    f.write("           </coordinates>\n" )
    f.write("   </LinearRing> </outerBoundaryIs> </Polygon> \n")
    f.write("</Placemark>\n")
    f.write("</Document>\n")
    f.write("</kml>\n")
    f.close()
    print ("File Created. ")
    print ("Press ENTER to exit. ")

#run the function
kmlForLab2(1,2)

Приведенный выше код отлично работает с этим файлом .csv с заголовком:

FID,X,Y
0,170.5464722,-45.75102725
1,170.5668576,-45.74410705
2,170.5830378,-45.75211941
3,170.5750982,-45.74847698
4,170.5836827,-45.75020334
5,170.5939802,-45.74689513
6,170.5857636,-45.74719562
7,170.5754473,-45.75424382
8,170.5646303,-45.7570933
9,170.5720296,-45.75808701
10,170.5690206,-45.74853323

но не с этим файлом, у которого нет заголовка и есть пустые строки между:

0,-78.66408134601733,9771.5546110773,1

0,-78.65548895240566,9771.551542342384,2

0,-78.65033681160779,9771.586626160439,3

0,-78.65335636231875,9771.627622956843,4

0,-78.66177515305098,9771.63688377605,5

0,-78.66785531910878,9771.60584192237,6

0,-78.66600112895804,9771.563037346988,7

0,-78.65791969380092,9771.547876588438,8

0,-78.651044721165,9771.57425465822,9

Первый файл .csv был предоставлен мне, а второй .csv был сгенерирован в python. Я думаю, что ошибаюсь при создании файла .csv?

Что вы подразумеваете под "рекурсивно"? Пожалуйста, редактировать, чтобы включить полную трассировку. Ваши образцы данных совсем не похожи на CSV-файлы.

tripleee 10.05.2022 20:04

Я не могу понять, что должно быть "рекурсивным" в этом коде. Прочтите Как спросить, ericlippert.com/2014/03/05/как-отлаживать-маленькие-программы и минимальный воспроизводимый пример; сначала попробуйте найти проблему самостоятельно и изолируйте минимальный код, необходимый для воспроизведения проблемы. Не забудьте включить достаточно, чтобы кто-то другой мог воспроизвести проблему, скопировав и вставив без изменений. Например, я понятия не имею, какие значения x и y следует использовать для вызова функции.

Karl Knechtel 10.05.2022 20:04

Можете ли вы сократить свой код до бита чтения CSV? Это облегчило бы нам проверку, и вы могли бы найти ошибку при этом.

Roger Lipscombe 10.05.2022 20:04

Каковы значения x и y?

Barmar 10.05.2022 20:11

У вас есть delimiter = ',' в читателе CSV, но ни в одном из файлов нет запятых.

Barmar 10.05.2022 20:11

Спасибо. Как только я открыл файл в блокноте, значения разделены запятой. Пожалуйста, проверьте еще раз образец файла .csv, который я предоставил с этим вопросом.

Indu 10.05.2022 20:22

@Barmar ... Я вызываю функцию kmlForLab2 (1,2) в последней строке. Значения x и y — это индексы строк файла csv.

Indu 10.05.2022 20:24
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
7
31
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Первая проблема - разделитель

data = csv.reader(open(fname + '.csv'), delimiter = ',')

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

Затем вы должны использовать

data = csv.reader(open(fname + '.csv'), delimiter='\t')

редактировать

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

    for row in data:
        if len(row) > max(x,y):
            f.write(str(( row[x])) + "," + (str( row[y]))+ "\n")

Как только я открыл файл в блокноте, значения разделены запятой. Пожалуйста, проверьте еще раз образец файла .csv, который я предоставил с этим вопросом.

Indu 10.05.2022 20:22
Ответ принят как подходящий

Вам нужно пропустить строки, в которых недостаточно полей.

cols_needed = max(x, y):
for row in data:
    if len(row) > cols_needed:
        f.write(f'{row[x]},{row[y]}\n')

Ваше предложение помогло. Я вернулся к тому, как я создал csv и добавил новую строку = '' " ..........with open("new_buffer.csv",'w', encoding='UTF8', newline='') as my_csv: new_buffer_csv = csv.writer(my_csv,delimiter=',') new_buffer_csv.writerows(df_buffer)

Indu 10.05.2022 20:45

Другие вопросы по теме