簡體   English   中英

迭代號逐行處理大文件

[英]Iteration number processing large files line by line

我需要逐行處理Python中的大文件(大約1GB)。 我使用這種方法來做到這一點:

with open('file.txt', 'r') as f:
    i = 0
    for fline in f:
        process(fline)
        i = i + 1
print i

i的值(迭代次數=文件的行數)是19,991,889。

但是該文件(使用EmEditor打開)報告該文件有63,941,070行。

為什么行數不匹配? 我做錯了什么?

謝謝。

我可以想到兩種可能性。

  1. 您在Windows上運行2.x,文件包含的'\\ r'字符大約是識別的'\\ r \\ n'或'\\ n'行尾的3倍,EmEditor會將'\\ r'識別為行尾,例如使用Python3.x。 或其他操作系統上的2.7發生了類似情況。

說明:您以文本模式打開文件。 3.x使用獨立於操作系統的通用換行符,並且將'\\ r'和'\\ r \\ n'轉換為'\\ n'。 2.x使用與操作系統有關的讀數,在Windows上僅使用'\\ r \\ n'。

例:

with open('tem.dat', 'wb') as f:
    f.write(b'a\rb\r\nc\n\rd\n')
with open('tem.dat', 'r') as f:
    for i, t in enumerate(f):
        print(i, t, repr(t[-1]))

3.x打印

0 a
 '\n'
1 b
 '\n'
2 c
 '\n'
3 
 '\n'
4 d
 '\n'

2.x打印

(0, 'a\rb\n', "'\\n'")
(1, 'c\n', "'\\n'")
(2, '\rd\n', "'\\n'")

診斷:在處理之前,將代碼添加到代碼“如果fline中為'\\ r':print(fline)”。

  1. 文件中有些東西被Python視為文件結束,而EmEditor沒有。 診斷。 在循環之前添加“ length = 0”,然后在循環中添加“ length + = len(fline)”,以查看其是否至少緊接其后。

數字不匹配,因為open函數使用的編碼不適用於此文件,請嘗試使用“ ISO-8859-1”編碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM