【问题标题】:python - writing hex digits to csvpython - 将十六进制数字写入csv
【发布时间】:2017-05-16 05:51:32
【问题描述】:

我有以下字符串:

>>> line = '\x00\t\x007\x00\t\x00C\x00a\x00r\x00d\x00i\x00o\x00 \x00M\x00e\x00t\x00a\x00b\x00o\x00l\x00i\x00c\x00 \x00C\x00a\x00r\x00e\x00\t\x00\t\x00\t\x00\t\x00 \x001\x002\x00,\x007\x008\x008\x00,\x005\x002\x008\x00.\x000\x004\x00\r\x00\n'

当我在 python 终端中键入变量 line 时,它显示以下内容:

>>> line
'\x00\t\x007\x00\t\x00C\x00a\x00r\x00d\x00i\x00o\x00 \x00M\x00e\x00t\x00a\x00b\x00o\x00l\x00i\x00c\x00 \x00C\x00a\x00r\x00e\x00\t\x00\t\x00\t\x00\t\x00 \x001\x002\x00,\x007\x008\x008\x00,\x005\x002\x008\x00.\x000\x004\x00\r\x00\n'

当我打印它时,它显示如下:

>>> print line
        7    Cardio Metabolic Care               12,788,528.04

在变量 line 中,每个单词都使用 \t 分隔,我想将其保存到 csv 文件中。所以我尝试使用以下代码:

import csv
with open('test.csv', 'wb') as csvfile:
    spamwriter = csv.writer(csvfile, delimiter=',')
    spamwriter.writerow(line.split('\t'))

当我查看 test.csv 文件时,我只得到以下内容

,,,,,,

是否可以将单词放入 csv 文件中。请帮忙。

【问题讨论】:

  • CSV 实际上并不代表逗号。它也代表 Tab。所以你已经有了一个 CSV!
  • 实际上我正在尝试将损坏的文件转换为 csv 文件。
  • 这可能会有所帮助:stackoverflow.com/questions/29230943/…
  • print(line.split("\t")) 给你什么?
  • 您读取文件不正确。使用open("source.csv","r", "utf-16")io.open("source.csv","r", encoding = "utf-16") 打开它。

标签: python csv


【解决方案1】:

您的输入文本没有损坏,它被编码为 UTF-16(在本例中为 Big Endian)。而且它本身就是 CSV,只是用制表符作为分隔符。

必须解码成字符串,才能正常使用。

理想情况下,您在从源中读取字节编码时声明正确的字节编码。例如,当您打开文件时,您可以说明文件使用的编码,以便文件阅读器为您解码内容。

如果您的字节串来自无法在读取时声明编码的来源,则可以手动解码:

line = '\x00\t\x007\x00\t\x00C\x00a\x00r\x00d\x00i\x00o\x00 \x00M\x00e\x00t\x00a\x00b\x00o\x00l\x00i\x00c\x00 \x00C\x00a\x00r\x00e\x00\t\x00\t\x00\t\x00\t\x00 \x001\x002\x00,\x007\x008\x008\x00,\x005\x002\x008\x00.\x000\x004\x00\r\x00\n'
decoded = line.decode('utf_16_be')

print decoded
#   7   Cardio Metabolic Care                12,788,528.04

但是因为我认为您实际上是从文件中读取它:

import csv
import codecs

with codecs.open('input.txt', 'r', encoding='utf16') as in_file, codecs.open('output.csv', 'w', encoding='utf8') as out_file:
    reader = csv.reader(in_file, delimiter='\t')
    writer = csv.writer(out_file, delimiter=',', quotechar='"')

    writer.writerows(reader)

【讨论】:

  • 请注意,我将文件读取为 UTF-16,但将其写入为 UTF-8,因为这是更常见的编码。选择您需要的输出编码。
  • 当然。非常感谢。
猜你喜欢
  • 2015-08-22
  • 2013-07-11
  • 2018-09-10
  • 2013-01-07
  • 2014-03-16
  • 1970-01-01
  • 2015-01-03
  • 2021-10-27
  • 1970-01-01
相关资源
最近更新 更多