2009-10-20 165 views
4

我正在嘗試讀取csv文件,但它不起作用。 我可以閱讀我的csv文件,但是當我看到我讀的時候,那裏有值之間的空白。如何用python讀取csv文件

這裏是我的代碼

# -*- 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'unix生成的CSV文件'(顯示Excel不是* only *的方式) – pavium 2009-10-20 09:09:28

+0

您的縮進不一致。 – SilentGhost 2009-10-20 09:12:10

+1

「值之間的空白」是什麼意思?該文件中有空白嗎? 'csv'從文件中得到的值在它們周圍有空格?順便說一句,你的線路終端是錯誤的。它應該是'\ n'而不是'n'。 – 2009-10-20 10:32:53

回答

7

我更喜歡使用numpy的的genfromtxt而不是標準CSV庫,因爲它產生numpy的的recarray,這是乾淨的數據結構,將數據存儲在表狀物體。

>>> 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> 

編輯:這個答案是很老。雖然numpy.genfromtxt,現今大多數人會使用熊貓:

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

這具有pandas.DataFrame,這是對數據進行分析更好結構的優勢。

+0

genofromtxt - > genfromtxt – Tshepang 2010-04-26 21:55:47

+0

固定,謝謝! – dalloliogm 2010-04-27 08:43:08

+0

您是否需要在'genfromtxt()'中使用'names = True'來獲取data ['firstcolumn']'工作? – 2013-03-05 04:37:08

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 

這將產生預期的結果。

獲取更多有用反饋的提示:通過自包含且完整的示例代碼演示您的問題,該代碼不包含無關且不重要的工件。