在应用编码写入之前检查数据是否不同

时间:2013-10-14 16:47:03

标签: python python-2.7 encoding

我有一个网络刮板抓取以下数据:

TESTDATA
DATA:DATA
Data £9500
Data £930
Data £500
Data £2250
Data £930
Data £500
Data £2250

DATATEST
DATA:DATA
Data £95001
Data £9302
Data £5003
Data £22504
Data £9305
Data £5006
Data £22507

正在运行:print full_end返回:

[u'TESTDATA', 'DATA:DATA', 'Data £9500', 'Data £930', 'Data £500', 'Data £2250', 'Data £930', 'Data £500', 'Data £2250', '\r', DATATEST', 'DATA:DATA', 'Data £95001', 'Data £9302', 'Data £5003', 'Data £22504', 'Data £9305', 'Data £5006', 'Data £22507']

正在运行:print repr(full_end)返回:

u"TESTDATA\nDATA:DATA\nData £9500\nData £930\nData £500\nData £2250\nData £930\nData £500\nData £2250\n\r\nDATATEST\nDATA:DATA\nData £95001\nData £9302\nData £5003\nData £22504\nData £9305\nData £5006\nData £22507"

正在运行:print repr('\r\n'.join(full_end).strip())返回:

u"TESTDATA\r\nDATA:DATA\r\nData £9500\r\nData £930\r\nData £500\r\nData £2250\r\nData £930\r\nData £500\r\nData £2250\r\n\r\r\nDATATEST\r\nDATA:DATA\r\nData £95001\r\nData £9302\r\nData £5003\r\nData £22504\r\nData £9305\r\nData £5006\r\nData £22507"

图片:http://i.imgur.com/Qe0TE5Y.png

使用以下脚本

with open('FULL_DATA.txt','r') as full_end_datafile:
    full_end_datafile_read = full_end_datafile.read()
    encoded_data = '\n'.join(full_end).encode("Latin-1")
    if full_end_datafile_read == encoded_data:
        encoded_data = "" 
    else:
        with open('FULL_DATA.txt','w') as full_end_datafile:
            full_end_datafile.write('\n'.join(full_end).encode("Latin-1"))

注意:在记事本中编辑文件在每个数据集/组之间显示1行,在记事本++中显示每个数据集/组之间的2行

http://i.imgur.com/FhV5wJx.png

如果我将写入和读取选项更改为rbwb,我会收到以下内容:

http://i.imgur.com/hmXy6tf.png

它无法识别数据是否相同并重新保存文件

任何人都知道如何解决这个问题?

提前致谢 - Hyflex

3 个答案:

答案 0 :(得分:1)

这是因为Python在处理文本文件时所做的End-Of-Line转换。 Windows EOL是两个字符(CRLF),而Unix / Linux仅使用LF。虽然Windows的记事本仅识别Windows的约定,但Notepad ++同时识别这两者。在第一张图片上,Python是当前的OS约定;在第二个图像中,您只是传递二进制数据(并且您将获得Unix / Linux约定)。

答案 1 :(得分:1)

打开文件时,请使用U标志:

with open('FULL_DATA.txt','Ur')

这意味着“通用EOL”,并将所有不同的EOL(例如\r\n)翻译为\n。 EOL之间的差异是您的比较失败的一个原因。可能还有其他人,但从这个开始。

答案 2 :(得分:0)

记事本不需要回车'\r'吗?

full_end_datafile.write('\r\n'.join(full_end).encode("Latin-1"))

在进行比较之前,您可以尝试剥离\r\n。如果你不关心看不见的东西,即使在你的字符串上运行.strip()来删除额外的空格也会有所帮助。