преобразование загруженного CSV в список Python - PullRequest
2 голосов
/ 05 марта 2011

У меня есть csv с двумя столбцами, который я загрузил через HTML-страницу для работы с помощью скрипта Python CGI. Глядя на файл на стороне сервера, он выглядит как длинная строка, то есть для файла с именем test.csv с содержимым.

col1,  col2  
x,y  

стало

('upfile', 'test.csv', 'col1,col2'\t\r\nx,y') 

Col1 содержит данные, с которыми я хочу работать (т. Е. X), а col 2 содержит свой идентификатор (y). Есть ли лучший способ сделать загрузку или мне нужно вручную извлечь нужные поля - это, вероятно, очень подвержен ошибкам спасибо

Ответы [ 4 ]

4 голосов
/ 05 марта 2011

Если вы используете модуль cgi в python, вы сможете сделать что-то вроде:

form = cgi.FieldStorage()
thefile = form['upfile']

reader = csv.reader(thefile.file)
header = reader.next() # list of column names
for row in reader:
    # row is a list of fields
    process_row(row)

См., Например, программирование cgi или модуль python cgi документы.

3 голосов
/ 05 марта 2011

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

Что-то вроде

import csv
import cgi

form = cgi.FieldStorage()
thefile = form['upfile']

reader = csv.reader(thefile, delimiter=',')
for row in reader:
  for field in row:
    doThing()

РЕДАКТИРОВАТЬ : Исправление моего ответа из ответа ars, опубликованного ниже.

2 голосов
/ 05 марта 2011

Похоже, что ваш файл изменяется после загрузки HTML. Есть ли что-то, что мешает вам просто зайти по ftp и сбросить csv-файл там, где он вам нужен?

Как только файл CSV станет более подходящим, вот быстрая функция, которая поместит его в 2D-массив:

def genTableFrCsv(incsv):
    table = []
    fin = open(incsv, 'rb')
    reader = csv.reader(fin)
    for row in reader: 
        table.append(row)
    fin.close()
    return table

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

0 голосов
/ 05 марта 2011

Простое решение - rows = [row.split('\t') for r in csv_string.split('\r\n')]. Ошибка допускается только в том случае, если пользователи с разных платформ отправляют данные. Они могут отправлять запятые или табуляции, и их разрывы строк могут быть \ n, \ r \ n, \ r или ^ M. Самое простое решение - использовать регулярные выражения. Добавьте эту страницу в закладки, если вы не знаете регулярные выражения:

http://regexlib.com/CheatSheet.aspx

И вот решение:

import re

csv_string = 'col1,col2'\t\r\nx,y' #obviously your csv opening code goes here

rows = re.findall(r'(.*?)[\t,](.*?)',csv_string)
rows = rows[1:] # remove header

Rows теперь список кортежей для всех строк.

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