精华内容
下载资源
问答
  • 最近处理文本文档时(文件约2GB大小),出现memoryError错误和文件读取太慢的问题,后来找到了两种比较快Large File ...Python 将文本文件的内容读入可以操作的字符串变量非常容易。文件对象提供了三个“读”方法...

    最近处理文本文档时(文件约2GB大小),出现memoryError错误和文件读取太慢的问题,后来找到了两种比较快Large File Reading 的方法,本文将介绍这两种读取方法。

    我们谈到“文本处理”时,我们通常是指处理的内容。Python 将文本文件的内容读入可以操作的字符串变量非常容易。文件对象提供了三个“读”方法: .read().readline().readlines()。每种方法可以接受一个变量以限制每次读取的数据量,但它们通常不使用变量。 .read() 每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。然而 .read() 生成文件内容最直接的字符串表示,但对于连续的面向行的处理,它却是不必要的,并且如果文件大于可用内存,则不可能实现这种处理。下面是read()方法示例:

    Python
    try: f = open('/path/to/file', 'r') print f.read() finally: if f: f.close()
    1
    2
    3
    4
    5
    6
    7
    try:
        f = open('/path/to/file', 'r')
        print f.read()
    finally:
        if f:
            f.close()
     

      调用read()会一次性读取文件的全部内容,如果文件有10G,内存就爆了,所以,要保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。另外,调用readline()可以每次读取一行内容,调用readlines()一次读取所有内容并按行返回list。因此,要根据需要决定怎么调用。
      如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便:

    Python
    for line in f.readlines(): process(line) # <do something with line>
    1
    2
    3
    for line in f.readlines():
        process(line) # <do something with line>
     

    Read In Chunks

      处理大文件是很容易想到的就是将大文件分割成若干小文件处理,处理完每个小文件后释放该部分内存。这里用了 iter & yield

    Python
    def read_in_chunks(filePath, chunk_size=1024*1024): """ Lazy function (generator) to read a file piece by piece. Default chunk size: 1M You can set your own chunk size """ file_object = open(filePath) while True: chunk_data = file_object.read(chunk_size) if not chunk_data: break yield chunk_data if __name__ == "__main__": filePath = './path/filename' for chunk in read_in_chunks(filePath): process(chunk) # <do something with chunk>
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    def read_in_chunks(filePath, chunk_size=1024*1024):
        """
        Lazy function (generator) to read a file piece by piece.
        Default chunk size: 1M
        You can set your own chunk size
        """
        file_object = open(filePath)
        while True:
            chunk_data = file_object.read(chunk_size)
            if not chunk_data:
                break
            yield chunk_data
     
    if __name__ == "__main__":
     
        filePath = './path/filename'
        for chunk in read_in_chunks(filePath):
            process(chunk) # <do something with chunk>
     

    Using with open()

      with语句打开和关闭文件,包括抛出一个内部块异常。for line in f文件对象f视为一个迭代器,会自动的采用缓冲IO和内存管理,所以你不必担心大文件。

    Python
    #If the file is line based with open(...) as f: for line in f: process(line) # <do something with line>
    1
    2
    3
    4
    5
    #If the file is line based
    with open(...) as f:
        for line in f:
            process(line) # <do something with line>
     

    Conclusion

      在使用python进行大文件读取时,应该让系统来处理,使用最简单的方式,交给解释器,就管好自己的工作就行了。




      zeropython 微信公众号 5868037 QQ号 5868037@qq.com QQ邮箱
    展开全文
  • Python 超大文件处理

    2013-12-06 15:14:00
    参考:http://www.nikhilgopal.com/2010/12/dealing-with-large-files-in-python.html及stackoverflow line by line的: 1.使用with关键词: 1 with open('somefile.txt', 'r') as FILE: 2 for line in FILE: ...

    参考:http://www.nikhilgopal.com/2010/12/dealing-with-large-files-in-python.html 及stackoverflow

    line by line的:

    1.使用with关键词:

    1 with open('somefile.txt', 'r') as FILE:
    2     for line in FILE:
    3         # operation

      类似于:

     

    1 for line in open('somefile.txt'):
    2     process_data(line)

     

    2.使用模块fileinput:

    1 import fileinput
    2 for i in fileinput.input('somefile.txt'):
    3     # operation

    3.建立缓存,精确控制缓冲区大小(readlines 和 read 均可):

    1 BUFFER = int(10E6) #10 megabyte buffer
    2 file = open('somefile.txt', 'r')
    3 text = file.readlines(BUFFER)
    4 while text != []:
    5     for t in text:
    6         # operation
    7     text = file.readlines(BUFFER)

    4.结合方法3使用yield:

     1 def read_in_chunks(file_object, chunk_size=1024):
     2     """Lazy function (generator) to read a file piece by piece.
     3     Default chunk size: 1k."""
     4     while True:
     5         data = file_object.read(chunk_size)
     6         if not data:
     7             break
     8         yield data
     9 
    10 
    11 f = open('really_big_file.dat')
    12 for piece in read_in_chunks(f):
    13     process_data(piece)

    5.使用iter:

    1 f = open('really_big_file.dat')
    2 def read1k():
    3     return f.read(1024)
    4 
    5 for piece in iter(read1k, ''):
    6     process_data(piece)

       再比如:

    1 f = ... # file-like object, i.e. supporting read(size) function and 
    2         # returning empty string '' when there is nothing to read
    3 
    4 def chunked(file, chunk_size):
    5     return iter(lambda: file.read(chunk_size), '')
    6 
    7 for data in chunked(f, 65536):
    8     # process the data

     

    转载于:https://www.cnblogs.com/warbean/p/3461452.html

    展开全文
  • Python如何处理超大gz文件 起因 线上执行日志统计任务,别说不应该,也别说不能。事儿就这么发生了,需要这么干! 1. 直接反应:用原生库 def read_gz_log_buildin(filename): if not os.path.exists(filename): ...

    Python如何处理超大gz文件

    起因

    线上执行日志统计任务,别说不应该,也别说不能。事儿就这么发生了,需要这么干!

    1. 直接反应:用原生库

    def read_gz_log_buildin(filename):
        if not os.path.exists(filename):
            raise Exception("no such file %s" % filename)
        import gzip
        with gzip.open(filename, 'rb') as f:
            for line in f:
                line = line[:-1]
                print(line)
            f.close()
    

    一句话:尼玛!3个G文件Python2.7用了10分钟,都影响业务了。干脆点:退出

    2. 懵,咋整,还有10分钟就要用数据!搜完全网就没个人说句公道话

    3. 尼玛:干。Python是胶水语言啊,大Linux可以啊

    $gunzip -c 1.gz 将一个gz文件内容输出到stdout
    
    def read_gz_log_popen(filename):
        if not os.path.exists(filename):
            raise Exception("no such file %s" % filename)
        rf = os.popen("gunzip -c %s" % filename)
        for line in rf:
            line = line[:-1]  # trim \n
            # print(line)  # do something
        cmd_ret = rf.close()
        if cmd_ret is None:
            print("success")
        else:
            print("error code is %d" % cmd_ret)
    

    任意 Python 版本 1G gz日志文件 <10s。

    搞定!

    展开全文
  • 使用Python读取大文件的方法 其实就是采用化整为零的思想,既然大数据那么多,那么我们就一点一点的来处理。...Python多进程分块读取超大文件的方法 一个人不行,那么我就多个人去做么,众人拾柴火焰高。 ...

    使用Python读取大文件的方法

    其实就是采用化整为零的思想,既然大数据那么多,那么我们就一点一点的来处理。

    还有
    Python多进程分块读取超大文件的方法

    一个人不行,那么我就多个人去做么,众人拾柴火焰高

    展开全文
  • #coding:utf-8 ...#打开文件,并将此文件设置为重定向目标文件 logFile = open('D:\\testlog.txt','w+') sys.stdout=logFile #读取大文件log中的数据信息 with open('D:\\log.txt','r') as fileStr: ...
  • Python快速读取超大文件

    千次阅读 2019-04-11 11:56:04
    测试文件共6862646行,79.3M大小,耗时6.7秒。 缺点:每一行数据内容不能大于内存大小(一般不会),否则就会造成MemoryError。 import time print("开始处理...") start = time.time() file = r'e:\Python\mypy\搜狗...
  • 让我直接开始问,我们真的需要Python来读取大型文本文件吗? 我们普通的文字处理程序或文本编辑器不能满足要求吗? 当我在这里提到大文件时,我指的是非常大的文件! 好吧,让我们看看一些证据,我们是否需要...
  • 很多时候处理数据会碰到CSV文件,如果是一般的少量文件问题不大,一旦碰到大型的CSV文件,就会出现打不开文件的结果。因为文本无法打开超大型文件,Excel也最多能够容量一百万条数据量,因此只能将CSV文件切割成为多...
  • 文件python处理

    2020-07-22 19:51:56
    遇到QA测试人员提供的了超大的log文件3.24G,有些无从下手,故写了如下python code,将大文件分割并保存监测出关键字的部分。 具体code如下 #!/usr/bin/python # AUTHER: ZPEG import os,sys,shutil findstr = ...
  • Python多线程超大日志文件解析转储,实现几十G超大文件并发处理。 实现功能如下: 1.多线程分块解析某超大日志文件,实现超大文件多线程分块处理 2.多线程写入数据到数据库postgresql/mysql 3.线程之间通过队列queue...
  • worker_id, num_workers): with open(filename, 'r') as f: size = os.fstat(f.fileno()).st_size # 指针操作,所以无视文件大小 print(f'size {size}') chunk_size = size // num_workers offset = worker_id * ...
  • python csv文件数据写入和读取(适用于超大数据量)

    万次阅读 多人点赞 2019-03-30 21:35:53
    文章目录python csv文件数据写入和读取(适用于超大数据量) python csv文件数据写入和读取(适用于超大数据量) 一般情况下由于我们使用的数据量比较小,因此可以将数据一次性整体读入或者写入,而且可以一次性对...
  • txt几百MB之后,基本就无法使用现有工具打开了,只能变成来读了,python很好用,代码如下,建议使用64位的版本本例打开7.5G的txt文件,并做了适当的归纳处理,也很快如果只是print那就更快了共统计49278874行时间...
  • Python 读取 超大文本会带来 以下问题: 1、内存溢出; 2、处理效率低; 处理问题1的思路有如下几种方案: 1、分块读取。  1) read()函数会将数据一次性读取到内存中,可通过将数据分块读取,readline()函数...
  • 有时候会有一些特别大的文本文件需要拆分处理 内容 1 曾经用过的笨办法 1.1 读取大文件的末尾n行 # 采用偏置方法读取末尾三百行文本 def read_tail_n(fname, n_lines): off = - 100 # 偏置量 min_size = - os.path...
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
  • Python文件分割

    千次阅读 2010-09-30 10:56:00
    一个EXCEL文件单表行数最多是65536行,超过这个行数,就无法再EXCEL中显示,在日常工作中,很多情况下需要对从数据库中提取的超大行数的数据进行EXCEL操作,所以我就想到了用python先把大文件进行分割处理,这样就...
  • Python如何处理大数据(知识整理)

    万次阅读 2017-08-29 10:18:08
    博文1:pandas.read_csv——分块读取大文件 ... 今天在读取一个超大csv文件的时候,遇到困难...首先使用office打不开然后在python中使用基本的pandas.read_csv打开文件时:MemoryError最后查阅read_csv文档发现可以
  • 如果一个csv文件过大,比如说达到好几G,直接读取的话内存估计hold不住,幸好pandas支持使用chunksize指定行数,每次按多少行多少行来读取,这样就避免了一次性读取过多数据导致内存崩溃。 用row["某个列的名称"] ...
  • [512]python mmap的使用-文件内存映射

    千次阅读 2019-01-30 12:49:55
    mmap是一种虚拟内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,...它占用物理内存空间少,可以解决内存空间不足的问题,适合处理超大文件 mmap在Windows和Linux平台上的行为有所不同。例如,W...
  • 2、文件编码格式的处理,避免乱码 3、python中字典对象的排序,按value值排序 """ import os import chardet def get_encoding(filename): """ :param filename: 文件路径 :return: 文件编码类型 """ tr
  • python 按行读取文件 ,网上搜集有N种方法,效率有区别,先mark最优答案,下次补充测试数据 with open('filename') as ...这是最佳方式,可以处理超大文件 转载于:https://www.cnblogs.com/cphmvp/p/5691811....
  • 处理文件足足有14个g(第一次处理这么大的csv文件) 由于数据文件太大,在读取csv文件的时候,遇到困难:首先使用wps打不开然后在python中使用基本的pandas.read_csv打开文件时报错:MemoryError 所以就需要分块对...
  • python学习日记

    2019-10-09 22:59:11
    python学习日记 1.读取超大文本文件 f=open(data_path,encoding="utf-8",mode="r") line=f.readline() while line: result=line.split(”,“) #文本处理 line=f.readline() 2
  • Python中的mmap模块

    千次阅读 2017-10-14 11:19:04
    mmap是一种虚拟内存映射...普通文件被映射到虚拟地址空间后,程序可以像操作内存一样操作文件,可以提高访问效率,适合处理超大文件 一个简单的例子: import mmap # write a simple example file with open("hel
  • 3. buffer = f.read() 一致性读取到buffer中,读取超大文件会发生MemoryError(可以设置每次读取的size或切割文件)。 #!/usr/bin/python3 # -*- coding: utf-8 -*- import re #文本所在路径,引号前加r指按路径...

空空如也

空空如也

1 2 3
收藏数 41
精华内容 16
关键字:

python处理超大文件

python 订阅