【发布时间】:2013-09-01 19:46:47
【问题描述】:
我在打开文本文件以在文件内容中查找匹配项时遇到可变文本编码问题。
我正在编写一个脚本来扫描文件系统以查找具有特定内容的日志文件,以便将它们复制到存档中。名称经常更改,因此内容是识别它们的唯一方法。我需要识别 *.txt 文件并在其内容中找到这些特定日志文件独有的字符串。
我下面的代码大部分都有效。问题是如果打开和编辑日志,它们的编码可能会发生变化。在这种情况下,Python 不会将搜索词与内容匹配,因为当 Python 使用错误的编码打开文件时,内容会出现乱码。
import os
import codecs
#Filepaths to search
FILEPATH = "SomeDrive:\\SomeDirs\\"
#Text to match in file names
MATCH_CONDITION = ".txt"
#Text to match in file contents
MATCH_CONTENT = "--------Base Data Details:--------------------"
for root, dirs, files in os.walk(FILEPATH):
for f in files:
if MATCH_CONDITION in f:
print "Searching: " + os.path.join(root,f)
#ATTEMPT A -
#matches only text file re-encoded as ANSI,
#UTF-8, UTF-8 no BOM
#search_file = open(os.path.join(root,f), 'r')
#ATTEMPT B -
#matches text files ouput from Trimble software
#"UCS-2 LE w/o BOM", also "UCS-2 Little Endian" -
#(same file resaved using Windows Notepad),
search_file = codecs.open(os.path.join(root,f), 'r', 'utf_16_le')
file_data = search_file.read()
if MATCH_CONTENT in file_data:
print "CONTENTS MATCHED: " + f
search_file.close()
我可以在检测编码的 Notepad ++ 中打开文件。使用常规 file.open() Python 命令不会自动检测编码。我可以使用 codecs.open 并指定编码来捕获单个编码,但随后必须编写多余的代码来捕获其余部分。我已经阅读了 Python 编解码器模块文档,它似乎没有任何自动检测。
我有哪些选项可以简洁而可靠地搜索任何编码的文本文件?
我读过chardet 模块,这看起来不错,但我确实需要避免安装模块。无论如何,必须有更简单的方式与古老而古老的文本文件进行交互。当然,作为一个新手,我把这弄得太复杂了,对吧?
Python 2.7.2,Windows 7 64 位。可能没必要,但here is a sample log file。
编辑: 据我所知,这些文件几乎肯定会采用代码 cmets 中的一种编码:ANSI、UTF-8、UTF_16_LE(如 UCS-2 LE w/o BOM;UCS-2 Little Endian)。总有可能有人找到绕过我的期望的方法......
编辑: 虽然使用外部库当然是合理的方法,但我有机会编写一些业余代码来猜测编码并在另一个问题中征求反馈 -> Pitfalls in my code for detecting text file encoding with Python?
【问题讨论】:
-
读取前三个字节,然后猜测。
-
猜猜是的。对于高级编程语言来说似乎很奇怪,不给你让他们猜测的选项!现在我发布了我的问题,我在侧边栏中看到了更多相关链接,这些链接结束了猜测或导入了一个可以进行有根据的猜测的模块。为重复道歉:Python: Is there a way to determine the encoding of text file?How to know the encoding of a file in Python?
标签: python python-2.7 encoding text-files