蟒蛇CSV分隔符的问题

问题描述:

我有这个脚本写入CSV文件:蟒蛇CSV分隔符的问题

import sqlite3 
import csv 
import codecs 
import cStringIO 
import sys 

class UTF8Recoder: 

    def __init__(self, f, encoding): 
     self.reader = codecs.getreader(encoding)(f) 

    def __iter__(self): 
     return self 

    def next(self): 
     return self.reader.next().encode("utf-8") 

class UnicodeReader: 
    """ 
    A CSV reader which will iterate over lines in the CSV file "f", 
    which is encoded in the given encoding. 
    """ 

    def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds): 
     f = UTF8Recoder(f, encoding) 
     self.reader = csv.reader(f, dialect=dialect, **kwds) 

    def next(self): 
     row = self.reader.next() 
     return [unicode(s, "utf-8") for s in row] 

    def __iter__(self): 
     return self 

class UnicodeWriter: 
    """ 
    A CSV writer which will write rows to CSV file "f", 
    which is encoded in the given encoding. 
    """ 

    def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds): 
     # Redirect output to a queue 
     self.queue = cStringIO.StringIO() 
     self.writer = csv.writer(self.queue, dialect=dialect, **kwds) 
     self.stream = f 
     self.encoder = codecs.getincrementalencoder(encoding)() 

    def writerow(self, row): 
     self.writer.writerow([unicode(s).encode("utf-8") for s in row]) 
     # Fetch UTF-8 output from the queue ... 
     data = self.queue.getvalue() 
     data = data.decode("utf-8") 
     # ... and reencode it into the target encoding 
     data = self.encoder.encode(data) 
     # write to the target stream 
     self.stream.write(data) 
     # empty queue 
     self.queue.truncate(0) 

    def writerows(self, rows): 
     for row in rows: 
      self.writerow(row) 

with open('agajan.csv', 'w') as f: 
    uW = UnicodeWriter(f, delimiter=' ') 
    row = ["agaja asa; . ' a", "t, o , ,rayev", "bazargeldiyevich"] 
    uW.writerow(row) 

的问题是不是比需要更多的写入列三列。在我的字符串中可能有任何字符,但我想正确地写入它。我怎样才能管理这个? 例如:row = ["agaja asa; . ' a", "t, o , ,rayev", "columns"]添加分号到最后一列"colu;mns"港岛线创建新列

我改变此为制表符分隔的格式:

with open('agajan.csv', 'w') as f: 
    #uW = UnicodeWriter(f, delimiter=' ') 
    uW = UnicodeWriter(f, delimiter="\t") 
    row = ["agaja asa; . ' a", "t, o , ,rayev", "colu;mns"] 
    uW.writerow(row) 
    row1 = ["I", "am", "ironman"] 
    uW.writerow(row1) 

当我观看的输出中的LibreOffice为制表符分隔的文件,它的工作如预期。

我不认为使用空格作为分隔符在这种情况下是一个不错的选择,因为您的字段几乎肯定会包含空格。因此,我相信作为分隔符的空间可能是创造额外的领域,而不是分号。

+0

它没有为我工作 – torayeff 2012-08-13 14:17:03

+0

你使用什么操作系统/ Python版本?此外,您使用什么方法来验证文件(例如在Excel中打开)。我的输出如下(我使用作为制表符,作为换行符,所以我可以在这里轻松打印):'agaja asa; 。 'a t,o,,rayev colu; mns I am ironman '。这两行中的每一行都有3列,这似乎是你所要求的。 Ubuntu 12.04 LTS,Python 2.7.3。 – 2012-08-13 22:28:31