• python 如何读取大文件


    一般的读取文件的方法:

    with open(file_path, "r") as f:

      print f.read()

    或者

    with open(file_path,"r") as f:

      for line in f.readlines():

        print line

    read()是一次性把文件内容以字符串的方式读到内存,放到一个字符串变量中

    readlines() 是一次性读取所有内容,并按行生成一个list

    因一次性读取,若文件内容过大,则会将内存爆掉。报错:“MemoryError”

    读取大几G的大文件,可以利用生成器 generator

    方法一: 将文件切分成小段,每次处理完小段,释放内存

    def read_in_block(file_path):

      BLOCK_SIZE=1024

      with open(file_path,"r") as f:

        while True:

          block =f.read(BLOCK_SIZE) #每次读取固定长度到内存缓冲区

          if block:

            yield block

          else:

            return #如果读取到文件末尾,则退出

    for block in read_in_block(file_path):

      print block

     // 这个方法,速度很快(只有3s),但有个问题,若满足了1024时,会将正好在1024位置的数据切开,如下

    cad1a596-fe14-45c4-b920-8bc0eab38ee6
    c6f0c5bf-4359-4a28-9f90-3c4f61b5e12d
    3815cd95-2147-4701-8d50-273325140643
    c047d057-c33d-4a69-995a-5
    29cb5cb04ee
    afd9cffb-09f0-4347-bf12-34485969b366
    3c145a79-c72c-43db-8e68-02be8046c6b4

    虽然每个block都是str, 但无法直接得到每行的id,只能再切分。

    方法二 利用open("","")系统自带方法生成的迭代对象

      with open(file_path) as f:

        for line in f:

          print line

    for line in f 这种用法是把文件对象f当作迭代对象,系统将自动处理IO缓存和内存管理。

    耗时较第1种方法慢一点,要25s。 但每个Line, type都是str, 都是自己需要的一行数据(一行是一个id)。

    >>> f = open("dup_file - Copy (2).txt")
    >>> type(f)
    <type 'file'>

    >>> type(f.read())
    <type 'str'>

    >>> f.read()

    ''

    >>>print  f.read()

    aac66f36-d2ad-4d94-9804-2220262cc354
    c5a1b5ee-32b6-4912-8b90-ece3bd36d1e5
    90e6509a-e918-447e-92ee-b853b9b49f15
    7b7495d3-1aa5-48b5-a305-ae137d46d605

    >>> f.readlines()
    []

    >>> type(f.readlines())
    <type 'list'>

    >>> print f.readlines()
    []

    >>> for i in f.readlines():
    ... type (i)
    ... print i

    <type 'str'>
    994761db-37fa-4243-9d13-0acd193763dd

    <type 'str'>
    993b2806-51fe-412d-8df2-526ea550e889

    <type 'str'>
    aac66f36-d2ad-4d94-9804-2220262cc354

    >>> type(f.readline())
    <type 'str'>

     // // //

    >>> f = open("dup_file - Copy (2).txt")
    >>> f.readline()
    '8957d983-05e2-4a54-a7b3-f1532421c7a7 '
    >>> f.readline()
    'ccf30309-2a02-4d09-8ea8-70c3da8de09d '
    >>> f.readline()
    '492ddb07-e0c5-4dda-ae91-8b3700d05a79 '
    >>> f.readline()
    '9cee8472-dfc1-49ac-90c3-572f68373934 '
    >>> f.readline()
    ''
    >>> f.readline()
    ''

    // // // 第1次调用f.readline(),没有输出或者操作,后面再也无法循环到

    >>> f = open("dup_file - Copy (2).txt")
    >>> type(f.readline())
    <type 'str'>
    >>> f.readline()
    'ccf30309-2a02-4d09-8ea8-70c3da8de09d '
    >>> f.readline()
    '492ddb07-e0c5-4dda-ae91-8b3700d05a79 '
    >>> f.readline()
    '9cee8472-dfc1-49ac-90c3-572f68373934 '
    >>> f.readline()
    ''
    >>> f.readline()

    // // //  使用文件对象f

    >>> f = open("dup_file - Copy (2).txt")
    >>> for i in f:
    ... type(i)
    ... print i
    ...
    <type 'str'>
    8957d983-05e2-4a54-a7b3-f1532421c7a7

    <type 'str'>
    ccf30309-2a02-4d09-8ea8-70c3da8de09d

    <type 'str'>
    492ddb07-e0c5-4dda-ae91-8b3700d05a79

    <type 'str'>
    9cee8472-dfc1-49ac-90c3-572f68373934

    >>> f = open("dup_file - Copy (2).txt")
    >>> for i in f.readlines():
    ... type(i)
    ... print i
    ...
    <type 'str'>
    8957d983-05e2-4a54-a7b3-f1532421c7a7

    <type 'str'>
    ccf30309-2a02-4d09-8ea8-70c3da8de09d

    <type 'str'>
    492ddb07-e0c5-4dda-ae91-8b3700d05a79

    <type 'str'>
    9cee8472-dfc1-49ac-90c3-572f68373934

  • 相关阅读:
    show parameters和强制索引失效
    ALTER INDEX 始末
    ADMIN OPTION和GRANT ANY OBJECT PRIVILEGE的问题
    oracle正则表达式函数简单总结(一)
    简单说一下Native Dynamic SQL(动态sql)和包DBMS_SQL
    金山快盘的文件上传
    桶中取黑白球问题
    读书笔记:编程之美求二进制数中1的个数
    vim配置文件.vimrc
    JVM内存管理
  • 原文地址:https://www.cnblogs.com/guohuino2/p/6043196.html
Copyright © 2020-2023  润新知