当前位置: 首页 > 面试题库 >

Python UTF-16 CSV阅读器

钱德海
2023-03-14
问题内容

我有一个UTF-16 CSV文件,我必须阅读。Python csv模块似乎不支持UTF-16。

我正在使用python 2.7.2。我需要解析的CSV文件很大,要运行几个GB的数据。

回答以下约翰·马钦(John Machin)的问题

print repr(open('test.csv', 'rb').read(100))

使用仅包含abc作为内容的test.csv输出

'\xff\xfea\x00b\x00c\x00'

我认为csv文件是在美国Windows机器上创建的。我正在使用Mac OSX Lion。

如果我使用phihag和test.csv提供的包含一条记录的代码。

使用的示例test.csv内容。下面是print repr(open(’test.csv’,’rb’)。read(1000))输出

'\xff\xfe1\x00,\x002\x00,\x00G\x00,\x00S\x00,\x00H\x00 \x00f\x00\xfc\x00r\x00 \x00e\x00 \x00\x96\x00 \x00m\x00 \x00\x85\x00,\x00,\x00I\x00\r\x00\n\x00'

phihag的代码

import codecs
import csv
with open('test.csv','rb') as f:
      sr = codecs.StreamRecoder(f,codecs.getencoder('utf-8'),codecs.getdecoder('utf-8'),codecs.getreader('utf-16'),codecs.getwriter('utf-16'))      
      for row in csv.reader(sr):
         print row

上面代码的输出

['1', '2', 'G', 'S', 'H f\xc3\xbcr e \xc2\x96 m \xc2\x85']
['', '', 'I']

预期输出为

['1', '2', 'G', 'S', 'H f\xc3\xbcr e \xc2\x96 m \xc2\x85','','I']

问题答案:

目前,csv模块不支持UTF-16。

在Python
3.x中,csv需要一个文本模式文件,您可以简单地使用encoding参数open来强制进行另一种编码:

# Python 3.x only
import csv
with open('utf16.csv', 'r', encoding='utf16') as csvf:
    for line in csv.reader(csvf):
        print(line) # do something with the line

在Python 2.x中,您可以重新编码输入:

# Python 2.x only
import codecs
import csv

class Recoder(object):
    def __init__(self, stream, decoder, encoder, eol='\r\n'):
        self._stream = stream
        self._decoder = decoder if isinstance(decoder, codecs.IncrementalDecoder) else codecs.getincrementaldecoder(decoder)()
        self._encoder = encoder if isinstance(encoder, codecs.IncrementalEncoder) else codecs.getincrementalencoder(encoder)()
        self._buf = ''
        self._eol = eol
        self._reachedEof = False

    def read(self, size=None):
        r = self._stream.read(size)
        raw = self._decoder.decode(r, size is None)
        return self._encoder.encode(raw)

    def __iter__(self):
        return self

    def __next__(self):
        if self._reachedEof:
            raise StopIteration()
        while True:
            line,eol,rest = self._buf.partition(self._eol)
            if eol == self._eol:
                self._buf = rest
                return self._encoder.encode(line + eol)
            raw = self._stream.read(1024)
            if raw == '':
                self._decoder.decode(b'', True)
                self._reachedEof = True
                return self._encoder.encode(self._buf)
            self._buf += self._decoder.decode(raw)
    next = __next__

    def close(self):
        return self._stream.close()

with open('test.csv','rb') as f:
    sr = Recoder(f, 'utf-16', 'utf-8')

    for row in csv.reader(sr):
        print (row)

opencodecs.open要求文件以BOM表开头。如果没有(或者您使用的是Python 2.x),仍然可以在内存中进行转换,如下所示:

try:
    from io import BytesIO
except ImportError: # Python < 2.6
    from StringIO import StringIO as BytesIO
import csv
with open('utf16.csv', 'rb') as binf:
    c = binf.read().decode('utf-16').encode('utf-8')
for line in csv.reader(BytesIO(c)):
    print(line) # do something with the line


 类似资料:
  • 我有以下类,它从/到包裹读取和写入对象数组: 在上面的代码中,我在读取< code>readParcelableArray时得到一个< code>ClassCastException: 错误/AndroidRuntime(5880):原因:Java . lang . classcastexception:[land roid . OS . parcelable; 上面的代码有什么错误?在编写对象数

  • 在问题[1]中,我了解到如果您想在Android下使用NFC标签,则不必采用NDEF格式。我想在Win 8.1 in. Net下执行此操作。我的情况是这样的: 我有一个RFID卡Mifare Classic 1K,其中存储了一个ID。(由制造商记录)该ID由我们的考勤系统通过通常的RFID读取器(例如Gigatek的PROMAG MFR120)读取。我们不在卡上写任何东西,我们只需要读取ID。但是

  • RSS 阅读器用于读取 RSS feed! RSS 阅读器可供许多不同的设备和操作系统使用。 RSS 阅读器 有很多不同的 RSS 阅读器。某些以 web services 的形式来工作,而某些则运行于 windows (或 Mac、PDA 或 UNIX)。 这是一些我尝试过并钟爱的阅读器: 这是一些我尝试过并钟爱的阅读器: RSS 阅读器 有很多不同的 RSS 阅读器。某些以 web servi

  • Android PDF Viewer 是Android平台下的PDF阅读器。

  • 实现简单的阅读器功能。包括首页的书架,滑动书架界面可以切换书架。点击书架上的书籍之后,进入阅读界面,有翻页的动画效果。可以加载显示txt文件。 [Code4App.com]

  • 我是新来的,我正在学习使用方法等等,我在方法中有我的代码,但在代码中有一个控制台。ReadLine();这是我不想要的。基本上,我需要做的是一个包含10个方法的大作业,作为输入,你必须调用哪个方法,然后调用实际的输入,但是当我的方法中有一个readline时,我必须给出3个,而不是2个。如果有人知道如何帮助noob,我的代码如下 基本上是int.parse(consolereadline);我需要

  • About July的新书《编程之法:面试和算法心得》纸质版在本github上的基础上做了极大彻底的改进、优化,无论是完整度、还是最新度、或质量上,都远非博客、github所能相比。换言之,新书《编程之法》的质量远高于博客、github。 此外,散落在网上其他任何地方的“编程之法”电子材料均是盗版自本github,更无质量可言。所以,July只唯一推荐《编程之法》纸质版。 《编程之法》纸质版已于2

  • 作为对《Heterogeneour Computing with OpenCL 2.0 (Thrid Edition)》英文版的中文翻译。 本书将介绍在复杂环境下的OpenCL和并行编程。这里的复杂环境包含多种设备架构,比如:多芯CPU,GPU,以及完全集成的加速处理单元(APU)。在本修订版中将包含OpenCL 2.0最新的改进: 共享虚拟内存(Shared virtual memory)可增强