迭代次数逐行处理大文件

时间:2016-07-24 20:00:12

标签: python file

我需要逐行处理Python(大约1GB)的大文件。 我用这种方法来做到这一点:

i

if(isset($_POST['submit'])) { //kada kliknu dugme submit if(!empty($nameX) || !empty($passX)) { if($XX == true) { if($passX == GetPlayerPassword($nameX)) { echo "Dobrodosli nazad!"; header( 'Location: http://www.youtube.com/' ); } else { header( 'Location: ../main.php' ); } } else { global $handler; echo "Novi account registrovan! Dobrodosli!"; $tmpQuery = "INSERT INTO registrovani (Username, Password) VALUES ('".$nameX."','".$passX."')"; mysqli_query($handler,$tmpQuery); } } else if(empty($nameX) || empty($passX)){ header( 'Location: ../main.php' ); } } 的值(迭代次数=文件的行数)为19,991,889。

但该文件(使用EmEditor打开)报告该文件有63,941,070行。

为什么线条数不匹配?我做错了什么?

感谢。

2 个答案:

答案 0 :(得分:0)

我可以想到两种可能性。

  1. 您在Windows上运行2.x,该文件包含大约3倍的' \ r'被识别的字符' \ r \ n'或者' \ n'行结尾,EmEditor认可' \ r'作为一个行结束,与Python 3.x一样。或者在另一个操作系统上发生类似的事情。
  2. 说明:以文本模式打开文件。 3.x使用与OS无关的通用换行符并且使用' \ 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'")
    

    诊断:添加到您的代码"如果' \ r'在fline中:print(fline)"在处理之前。

    1. 文件中的某些内容被Python视为文件结束而EmEditor没有。诊断。添加&长度= 0'在循环之前和'长度+ = len(fline)'在循环中看看它是否至少大约在它之后。

答案 1 :(得分:0)

数字不匹配,因为open函数使用的编码对于此文件不正确,请尝试使用“ISO-8859-1”编码。