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

在Python中从gzip格式的CSV删除BOM

锺功
2023-03-14
问题内容

我正在使用以下代码解压缩并保存CSV文件:

with gzip.open(filename_gz) as f:
    file = open(filename, "w");
    output = csv.writer(file, delimiter = ',')
    output.writerows(csv.reader(f, dialect='excel', delimiter = ';'))

似乎一切正常,除了文件中的第一个字符是意外的事实。谷歌搜索似乎表明这是由于文件中的BOM。

我已经读过,将内容编码为utf-8-sig应该可以解决此问题。但是,添加:

.read().encoding('utf-8-sig')

到csv.reader中的f失败并显示:

File "ckan_gz_datastore.py", line 16, in <module>
    output.writerows(csv.reader(f.read().encode('utf-8-sig'), dialect='excel', delimiter = ';'))
File "/usr/lib/python2.7/encodings/utf_8_sig.py", line 15, in encode
    return (codecs.BOM_UTF8 + codecs.utf_8_encode(input, errors)[0], len(input))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 0: ordinal not in range(128)

如何删除BOM表并将其内容保存在正确的utf-8中?


问题答案:

首先,您需要解码文件内容,而不是对其进行编码。

其次,该csv模块不喜欢Python 2.7中的unicode字符串,因此在对数据进行解码之后,您需要将其转换回utf-8。

最后,csv.reader在文件的各行上传递迭代,而不是其中包含换行符的大字符串。

所以:

csv.reader(f.read().decode('utf-8-sig').encode('utf-8').splitlines())

但是,您可能认为仅手动删除BOM会更简单/更有效:

def remove_bom(line):
    return line[3:] if line.startswith(codecs.BOM_UTF8) else line

csv.reader((remove_bom(line) for line in f), dialect = 'excel', delimiter = ';')

这有一点不同,因为它从任何以“ 1”开头的行中删除了BOM,而不仅仅是第一行。如果您不需要保留其他BOM,那么可以使用以下方法进行修复:

def remove_bom_from_first(iterable):
    f = iter(iterable)
    firstline = next(f, None)
    if firstline is not None:
        yield remove_bom(firstline)
        for line in f:
            yield f


 类似资料:
  • 问题内容: 我有一个可以下载,编辑然后再次上传CSV文件的过程。在下载时,CSV文件的格式正确,没有换行双引号 当我在电子表格中打开CSV并进行编辑和保存时,它会在字符串周围添加双引号 我认为这只是电子表格的作用(在本例中为openoffice)。我希望我的上传脚本删除环绕双引号。我不能删除所有引号,以防万一正文包含它们,并且我也不想仅检查第一个和最后一个字符是否包含双引号。 我几乎确定pytho

  • 我有一个名为key_resp_5_rt的列,其中我想删除300ms以下的所有行(这是一个反应时间列) 有人能告诉我下面的代码是否可以删除rt小于0.3秒的行吗? 当我事后检查时,值低于0.3的行仍然存在,我不知道为什么

  • 问题内容: 我有一个从mysql数据库附加的对象列表,并包含空格。我希望删除下面的空格,但是im使用的代码不起作用? 问题答案: Python中的字符串是不可变的(这意味着它们的数据无法修改),因此replace方法不会修改字符串-它返回一个新字符串。您可以按以下方式修复代码: 但是,实现目标的更好方法是使用列表理解。例如,以下代码使用以下命令从列表中的每个字符串中删除前导和尾随空格:

  • 我收到的csv文件格式不正确(无法控制生成此csv的应用程序) CSV的标题和第一行如下所示: 这是我用来读取csv的代码: 这是我收到的输出: 第一个问题是奇怪的字符(可能缺少编码选项?)另外,标题是错误的,不能在该格式上使用DictReader,这对于编辑CSV非常有用。 我可以重写一个新的CSV与标题正确格式化,这不是一个问题,但我不知道如何跳过CSV的前3行!?或者我可以用CSV即将到来的

  • 问题内容: 我只想删除第三行中值为‘0’的行。数据示例如下: 因此,第一行将需要删除,而第二行将保留。 到目前为止,我所拥有的如下: 任何帮助都会很棒 问题答案: 你很亲密 目前,您将整数与进行比较,然后将其与字符串进行比较。当您从文件中读取数据时,它是一个字符串而不是整数,因此这就是您的整数检查当前失败的原因: 另外,您可以使用关键字使当前代码略显pythonic,从而减少代码中的行,并且可以省

  • 问题内容: Python的string.whitespace很棒: 如何在不使用手动输入regex的’\ t | \ n | …等的情况下将其与字符串一起使用? 例如,它应该能够显示:“请\ n不要\ t伤害我。 进入 “请不要伤害我。” 我可能想保留单个空格,但是我想只要去string.whitespace [:-1]就足够了。 问题答案: 正是这种用例有一个特殊情况的快捷方式! 如果不带参数调