代码之家  ›  专栏  ›  技术社区  ›  Janusz Skonieczny

如何在没有csv.reader迭代器的情况下解析单行csv字符串?

  •  1
  • Janusz Skonieczny  · 技术社区  · 15 年前

    我有一个csv文件,需要重新排列和重新编码。我想跑步

    line = line.decode('windows-1250').encode('utf-8')
    

    在csv阅读器解析和拆分它之前的每一行上。或者,我希望自己对行进行迭代,运行重新编码,使用单行解析表单csv库,但使用相同的阅读器实例。

    有什么好办法吗?

    3 回复  |  直到 15 年前
        1
  •  2
  •   Dawid    15 年前

    文件上的循环行可以这样做:

    with open('path/to/my/file.csv', 'r') as f:
        for line in f:
            puts line # here You can convert encoding and save lines
    

    $ iconv -f Windows-1250 -t UTF8 < file.csv > file.csv
    

    编辑: 那么问题在哪里呢?

    with open('path/to/my/file.csv', 'r') as f:
        for line in f:
            line = line.decode('windows-1250').encode('utf-8')
            elements = line.split(",")
    
        2
  •  2
  •   Janusz Skonieczny    15 年前

    THX,作为答案。包装纸给了我一个想法:

    def reencode(file):
        for line in file:
            yield line.decode('windows-1250').encode('utf-8')
    
    csv_writer = csv.writer(open(outfilepath,'w'), delimiter=',',quotechar='"', quoting=csv.QUOTE_MINIMAL)
    csv_reader = csv.reader(reencode(open(filepath)), delimiter=";",quotechar='"')
    for c in csv_reader:
        l = # rearange columns here
        csv_writer.writerow(l)
    

    这正是我要重新编码的,在csv阅读器解析之前。

        3
  •  2
  •   Mark Tolonen    15 年前

    在最底层 csv documentation 是一组实现对csv的Unicode支持的类(unicodereader和unicodewriter):

    rfile = open('input.csv')
    wfile = open('output.csv','w')
    csv_reader = UnicodeReader(rfile,encoding='windows-1250')
    csv_writer = UnicodeWriter(wfile,encoding='utf-8')
    for c in csv_reader:
        # process Unicode lines
        csv_writer.writerow(c)
    rfile.close()
    wfile.close()