2009-10-20 3 views
4

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

Вот мой код

# -*- coding: iso-8859-1 -*- 
import sql_db, tmpl_macros, os 
import security, form, common 

import csv 

class windows_dialect(csv.Dialect): 
    """Describe the usual properties of unix-generated CSV files.""" 
    delimiter = ',' 
    quotechar = '"' 
    doublequote = 1 
    skipinitialspace = 0 
    lineterminator = 'n' 
    quoting = csv.QUOTE_MINIMAL 


def reco(d): 
cars = {210:'"', 211:'"', 213:"'", 136:'à', 143:'è', 142:'é'} 
for c in cars: 
    d = d.replace(chr(c),cars[c]) 
return d 

def page_process(ctx): 
if ctx.req_equals('catalog_send'): 
    if 'catalog_file' in ctx.locals.__dict__: 
    contenu = ctx.locals.catalog_file[0].file.read() 
    #contenu.encode('') 
    p = csv.reader(contenu, delimiter=',') 
    inserted = 0 
    modified = 0 
    (cr,db) = sql_db.cursor_get() 
    for line in p: 
    if line: 
    logfile = open('/tmp/test.log', 'a') 
    logfile.write(line[0]) 
    logfile.write('\n') 
    logfile.write('-----------------------------\n') 
    logfile.close() 
+0

+1 для 'CSV-файлов, созданных unix' (показывая, что Excel не является * единственным способом) – pavium

+0

ваш отступ несовместим. – SilentGhost

+1

Что означает «пробел между значениями»? В файле есть пробелы? Значения, которые 'csv' получили из файла, имеют пробелы вокруг них? Ваш терминатор линии ошибочен, BTW. Это должно быть '\ n' не' n'. –

ответ

7

Я предпочитаю использовать genfromtxt Numpy, а не стандартной библиотеки CSV, потому что он генерирует recarray Numpy, которая чистые структуры данных для хранения данных в табличном объекте.

>>> from numpy import genfromtxt 
>>> data = genfromtxt(csvfile, delimiter=',', dtype=None) 
# data is a table-like structure (a numpy recarray) in which you can access columns and rows easily 
>>> data['firstcolumn'] 
<content of the first column> 

EDIT: Ответ на этот вопрос довольно старый. В то время как numpy.genfromtxt, в настоящее время большинство людей используют панда:

>>> import pandas as pd 
>>> pd.read_csv(csvfile) 

Это имеет преимущество создания pandas.DataFrame, которая является лучшей структурой для анализа данных.

+0

genofromtxt -> genfromtxt – Tshepang

+0

исправлено, спасибо !! – dalloliogm

+0

Вам не нужно использовать 'names = True' в' genfromtxt() 'для получения' data ['firstcolumn'] 'для работы? –

0

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

csv.register_dialect('windows_dialect', windows_dialect) 
p = csv.reader(contenu, dialect='windows_dialect') 

также не уверен, что функция reco для.

2

Если у вас есть контроль над данными, использование разделителями табуляции вместо ::

import csv 
import string 

writer = open('junk.txt', 'wb') 
for x in range(10): 
    writer.write('\t'.join(string.letters[:5])) 
    writer.write('\r\n') 
writer.close() 
reader = csv.reader(open('junk.txt', 'r'), dialect='excel-tab') 
for line in reader: 
    print line 

Это приводит к ожидаемым результатам.

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

Смежные вопросы