我有大量文件包含我尝试使用Python脚本处理的数据。
文件采用未知编码,如果我在Notepad ++中打开它们,它们包含由加载的“null”字符分隔的数字数据(在Notepad ++中黑色背景上用白色表示为NULL)。
为了处理这个问题,我使用空字符\ x00分隔文件,并使用以下脚本仅检索数值:
stripped_data=[]
for root,dirs,files in os.walk(PATH):
for rawfile in files:
(dirName, fileName)= os.path.split(rawfile)
(fileBaseName, fileExtension)=os.path.splitext(fileName)
h=open(os.path.join(root, rawfile),'r')
line=h.read()
for raw_value in line.split('\x00'):
try:
test=float(raw_value)
stripped_data.append(raw_value.strip())
except ValueError:
pass
但是,文件中有时会出现其他无法识别的字符(据我所知,总是在开头) - 这些字符在Notepad ++中显示为“EOT”,“SUB”和“ETX”。它们似乎干扰了Python中文件的处理 - 文件似乎以这些字符结束,即使在Notepad ++中有明显更多的数据可见。
如何在处理之前从这些文件中删除所有非ASCII字符?
答案 0 :(得分:5)
您正在以文本模式打开文件。这意味着第一个Ctrl-Z字符被视为文件结束字符。在open()中指定'rb'而不是'r'。
答案 1 :(得分:1)
我不知道这是否可行,但您可以尝试使用codec
模块中的IO方法:
import codec
inFile = codec.open(<SAME ARGS AS 'OPEN'>, 'utf-8')
for line in inFile.readline():
do_stuff()
您可以将inFile
视为普通的FILE对象。
这可能会或可能不会对您有所帮助,但可能会有所帮助。
<强> [编辑] 强>
基本上,您将h=open(os.path.join(root, rawfile),'r')
替换为h=open(os.path.join(root, rawfile),'r', 'utf-8')
答案 2 :(得分:1)
file.read()功能将一直读到EOF。 正如你所说,它太早停止你想要继续阅读文件,即使在击中EOF时。 确保在阅读完整个文件后停止。您可以通过在点击EOF时通过file.tell()检查文件中的位置并在达到文件大小时停止(在读取之前读取文件大小)来执行此操作。
由于这相当复杂,您可能希望使用file.next并迭代字节。
要删除非ascii字符,您可以使用特定字符的白名单,也可以针对您定义的范围检查读取字节。 例如。是x30和x39之间的字节(数字) - &gt;保持/保存在某处/将其添加到字符串中。 请参阅ASCII table。