如何检查CSV文件的编码

Vip*_*pul 39 csv encoding

我有一个CSV文件,我希望了解它的编码.Microsoft Excel中是否有一个菜单选项可以帮助我检测它

或者我是否需要使用C#或PHP等编程语言来推断它.

Cam*_*amW 43

您可以使用记事本打开文件,然后转到文件 - >另存为.在"保存"按钮旁边会有一个编码下拉列表,将在那里选择文件的当前编码.

  • 咦?这是使用chardet还是什么?这感觉就像一个糟糕的答案. (6认同)
  • 您是在问 Windows 的内置文本编辑器、记事本是否使用 python(或潜在的 js)库?我敢肯定它不会,因为它将用像 C++ 这样的本地编译语言编写。此外,文本编码基于事实,而不是感觉,因此如果您知道为什么这是一个糟糕的答案,请务必提出它,但您的感觉与讨论无关。 (3认同)
  • 事情是这样的:CSV 格式没有识别其字符编码的方法。格式本身没有。因此,打开 CSV 的任何内容都必须猜测用于创建文件的编码。问题是,记事本是如何做到这一点的?Chardet 是一个用于此目的的库,它基于浏览器的工作方式(IIRC,它最初是一个 C 程序)。如果记事本正在猜测编码(而不是假设所有 CSV 都是 `windows-1252` 或类似的东西),它使用的是像 chardet 这样的东西。但是什么?我们不知道。我不会推荐这种方法。这是一个黑匣子。 (3认同)

小智 28

在Linux系统中,您可以使用file命令.它将提供正确的编码

样品:

file blah.csv
Run Code Online (Sandbox Code Playgroud)

输出:

blah.csv: ISO-8859 text, with very long lines
Run Code Online (Sandbox Code Playgroud)

  • 注意:我认为它不是很可靠。我保存了一个普通的 csv 并检查了十六进制代码,它是 GB2312(我的系统默认编码)。但文件结果是“ASCII-text”。然而,也许这里的“ASCII-text”代表的是**system defaulted**,超出了它的本意。 (2认同)

小智 18

如果使用Python,则只需使用print()函数来检查csv文件的编码。例如:

with open('file_name.csv') as f:
    print(f)
Run Code Online (Sandbox Code Playgroud)

输出是这样的:

<_io.TextIOWrapper name='file_name.csv' mode='r' encoding='utf8'>
Run Code Online (Sandbox Code Playgroud)

  • 注意:这*可能*不是100%正确的。我有一个可以作为“utf-16”正确打开的 CSV 文件,但此答案中的方法返回“cp1252”。尝试使用 Pandas CSV 阅读器打开它,因为“cp1252”会返回“ParserError”,因此,某处出了问题。 (7认同)
  • 这就是问题的答案。谢谢。 (5认同)
  • 这个答案好像是错误的!它总是显示“cp1252”,即使我可以在 Notepad++ 中看到 csv 文件是 utf-8。仅当执行“with open('file_name.csv',encoding='utf-8') as f:”时,它实际上显示 utf-8,这没有帮助。 (3认同)
  • 这个答案是完全错误的。Python 用于打开文件的编码*不一定*与文件中数据的编码相对应;Python仅使用**平台的默认编码**。在 Linux 上,我相信 Mac 上,它是 UTF-8,而在 Windows 上,它是 CP1252,因此上面的评论说这总是返回“cp1252”。有关更多详细信息,请参阅[有关“open”的文档](https://docs.python.org/3/library/functions.html#open)。 (3认同)
  • 我同意@Mast (2认同)

Ric*_*ick 8

使用chardet https://github.com/chardet/chardet?文档简短易读)。

安装python,然后pip install chardet,最后使用命令行命令。

我在 GB2312 下测试过,非常准确。(确保您至少有几个字符,只有 1 个字符的样本可能很容易失败)。

file 如您所见,并不可靠。

在此处输入图片说明


Md *_*ari 5

您还可以使用 python chardet 库

# install the chardet library
!pip install chardet

# import the chardet library
import chardet 

# use the detect method to find the encoding
# 'rb' means read in the file as binary
with open("test.csv", 'rb') as file:
    print(chardet.detect(file.read()))
Run Code Online (Sandbox Code Playgroud)


小智 5

或者您可以在 python 控制台或 Jupyter Notebook 中执行:

import csv
data = open("file.csv","r") 
data
Run Code Online (Sandbox Code Playgroud)

您将看到有关数据对象的信息,如下所示:

<_io.TextIOWrapper name='arch.csv' mode='r' encoding='cp1250'>
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它包含编码信息。


Ste*_*els 5

CSV 文件没有指示编码的标头。

你只能通过查看来猜测:

  • 创建文件的平台/应用程序
  • 文件中的字节数

2021年,表情符号被广泛使用,但很多导入工具却导入失败。上面的答案中经常推荐该chardet库,但该库不能很好地处理表情符号。

icecream = ''

import csv

with open('test.csv', 'w') as f:
    wf = csv.writer(f)
    wf.writerow(['ice cream', icecream])


import chardet
with open('test.csv', 'rb') as f:
    print(chardet.detect(f.read()))

{'encoding': 'Windows-1254', 'confidence': 0.3864823918622268, 'language': 'Turkish'}
Run Code Online (Sandbox Code Playgroud)

这会在尝试使用此编码读取文件时出现 UnicodeDecodeError。

Mac 上的默认编码是 UTF-8。它被明确地包含在这里,但这甚至不是必要的......但在 Windows 上可能是这样。

with open('test.csv', 'r', encoding='utf-8') as f:
    print(f.read())

ice cream,
Run Code Online (Sandbox Code Playgroud)

file命令也发现了这个

file test.csv
test.csv: UTF-8 Unicode text, with CRLF line terminators
Run Code Online (Sandbox Code Playgroud)

我在 2021 年的建议是,如果自动检测出错:UTF-8在求助于chardet.