2015-06-12 3 views
2

Я пытаюсь понять/визуализировать процесс разбора необработанного файла данных csv в Python с dataquest.io учебным курсом.Разбор CSV в Python 101

Я понимаю, что rows = data.split('\n') разделяет длинную строку файла csv на строки, основанные на том, где разрыв строки. то есть:

day1, sunny, \n day2, rain \n 

становится

day1, sunny 
day2, rain 

Я думал, что петля for будет дальше нарушать данные во что-то вроде:

day 1 
sunny 
day 2 
rain 

Вместо этого, конечно, кажется, подразумевает, что будет на самом деле стать список из списков. Я не понимаю, почему это происходит?

weather_data = [] 

f = open("la_weather.csv", 'r') 
data = f.read() 
rows = data.split('\n') 
for row in rows: 
    split_row = row.split(",") 
    weather_data.append(split_row) 
+0

На самом деле вы читаете файл csv как обычный текстовый файл. Для использования его имеет метод csv, вы должны использовать модуль чтения csv – The6thSense

+0

И если вы хотите проанализировать все данные с помощью ',' u, вы можете использовать split (",") установил – The6thSense

+0

то, что вы хотите добавить в погодные данные – The6thSense

ответ

3

я игнорирую материал, CSV и концентрируясь только на список вашего непонимания. Когда вы разбиваете строку текста, он становится списком строк. То есть, rows становится: ["day1, sunny","day2, rain"].

Оператор for, применяемый к списку, выполняет итерации по элементам этого списка. Таким образом, на первый раз через row"day1, sunny" будет, то второй раз через него будет "day2, rain" и т.д.

Внутри каждой итерации для цикла, он создает новый список, путем разделения строки на запятых INTO, например, , ["day1"," sunny"]. Все эти списки добавляются в список weather_data, который вы создали в начале. Вы получаете список списков, то есть [['day1', ' sunny'], ['day2', ' rain']]. Если вы хотите ['day1', ' sunny', 'day2', ' rain'], вы могли бы сделать:

for row in rows: 
    split_row = row.split(",") 
    for ele in split_row: 
     weather_data.append(ele) 
+0

["day1, sunny", "day2, rain"] - например, перед циклом for есть две строки. Автор/курс, предложенный после цикла for, будет состоять из двух строк и двух столбцов (с погодным типом в качестве столбца два). Почему бы не разбить его на ["day1", "sunny", "day2", "rain"] - 4 строки? цикл for запрашивает прерывание всякий раз, когда видит запятую. –

+0

Я ответил дальше, жалею, что не полностью ответил на вопрос. – riker

+0

Каков ожидаемый результат этой программы, поскольку теперь он дает выходные данные, такие как '[[« day1 »,« sunny »], [« day2 »,« rainy »]]' – The6thSense

0

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

import csv 
with open("la_weather.csv", 'rb') as f: 
    spamreader = csv.reader(f,delimiter=',') 
    for row in spamreader: 
     #do stuff 

Здесь spamreader является объектом для чтения, и вы можете получить строки как кортеж с петлей над ним.

И если вы хотите, чтобы получить все строки в списке, вы можете просто преобразовать spamreader в список:

with open("la_weather.csv", 'rb') as f: 
    spamreader = csv.reader(f,delimiter=',') 
    print list(spamreader) 
1

Этот код делает сделать список списков.

Как вы говорите, первый split преобразует данные в список, по одному элементу на строку.

Затем для каждой строки второй split преобразует его в другой список, по одному элементу на столбец.

А затем второй список добавляется в качестве отдельного элемента в список weather_data, который теперь, как указано в инструкциях, содержит список списков.

Обратите внимание, что этот код не очень хорошо - совершенно независимо от того, что вы всегда использовать csv модуль, как и другие отметили, вы бы никогда не делать f.read(), а затем разделить результат. Вы бы просто сделали for line in f, который автоматически выполняет итерацию по каждой строке.