精华内容
下载资源
问答
  • 我有一个非常大的csv...此外,因为我想将行转换为numpy数组,我不想读取任何一半的行,所以不是指定大小,我想要一些我可以在读者中指定"no of rows”的东西.有没有内置功能或简单的方法来做到这一点.最佳答案cs...

    我有一个非常大的csv文件,我无法在内存中完整加载.所以我想逐个阅读,将其转换为numpy数组,然后再进行一些处理.

    但问题是它是一个普通的读者,我无法在csvReader中找到任何指定大小的选项.

    此外,因为我想将行转换为numpy数组,我不想读取任何一半的行,所以不是指定大小,我想要一些我可以在读者中指定"no of rows”的东西.

    有没有内置功能或简单的方法来做到这一点.

    最佳答案

    csv.reader不会将整个文件读入内存.当您遍历读者对象时,它会逐行地遍历文件.所以你可以像往常一样使用阅读器,但是在你阅读之后要从你的迭代中断,无论你想读多少行.您可以在

    C-code used to implement the reader object中看到这一点.

    Initializer for the reader objecT:

    static PyObject *

    csv_reader(PyObject *module, PyObject *args, PyObject *keyword_args)

    {

    PyObject * iterator, * dialect = NULL;

    ReaderObj * self = PyObject_GC_New(ReaderObj, &Reader_Type);

    if (!self)

    return NULL;

    self->dialect = NULL;

    self->fields = NULL;

    self->input_iter = NULL;

    self->field = NULL;

    // stuff we dont care about here

    // ...

    self->input_iter = PyObject_GetIter(iterator); // here we save the iterator (file object) we passed in

    if (self->input_iter == NULL) {

    PyErr_SetString(PyExc_TypeError,

    "argument 1 must be an iterator");

    Py_DECREF(self);

    return NULL;

    }

    static PyObject *

    Reader_iternext(ReaderObj *self) // This is what gets called when you call `next(reader_obj)` (which is what a for loop does internally)

    {

    PyObject *fields = NULL;

    Py_UCS4 c;

    Py_ssize_t pos, linelen;

    unsigned int kind;

    void *data;

    PyObject *lineobj;

    if (parse_reset(self) < 0)

    return NULL;

    do {

    lineobj = PyIter_Next(self->input_iter); // Equivalent to calling `next(input_iter)`

    if (lineobj == NULL) {

    /* End of input OR exception */

    if (!PyErr_Occurred() && (self->field_len != 0 ||

    self->state == IN_QUOTED_FIELD)) {

    if (self->dialect->strict)

    PyErr_SetString(_csvstate_global->error_obj,

    "unexpected end of data");

    else if (parse_save_field(self) >= 0)

    break;

    }

    return NULL;

    }

    如您所见,next(reader_object)在内部调用next(file_object).所以你要逐行迭代,而不是将整个内容读入内存.

    展开全文
  • ![图片说明](https://img-ask.csdn.net/upload/202001/24/1579857006_321409.png) 假设文件名为file。。 感觉不是很难,但完全不知道该用哪些函数,也没提示,无从下手 具体问题如下
  • 最近处理文本文档时(文件约2GB大小),出现memoryError错误和文件读取太慢的问题,后来找到了两种比较快Large File Reading 的方法,本文将介绍这两种读取方法。 准备工作 我们谈到“文本处理”时,我们通常是指...

    转: https://www.cnblogs.com/wenBlog/p/8441231.html

    背景

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

    准备工作

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

    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()最方便:

    for line in f.readlines():
    	process(line)
    

    分块读取

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

    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>
    

    使用With open()

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

    #If the file is line based
    with open(...) as f:
      for line in f:
        process(line) # <do something with line>
    
    

    优化

    面对百万行的大型数据使用with open 是没有问题的,但是这里面参数的不同也会导致不同的效率。经过测试发先参数为"rb"时的效率是"r"的6倍。由此可知二进制读取依然是最快的模式。

    with open(filename,"rb") as f: 
        for fLine in f: 
          pass  
    

    测试结果:rb方式最快,100w行全遍历2.9秒。基本能满足中大型文件处理效率需求。如果从rb(二级制读取)读取改为r(读取模式),慢5-6倍。

    展开全文
  • 对于在Python读取文件的操作,一般我们会这样来操作: f = open('filename','rb') f.read() 下面我们来找1个比较大的文件,比如1个nginx的日志文件,记得之前有一次公司的1天的nginx日志文件解压为3GB大小,不得不...

    如何使用Python读取1个8GB大小的文件,这个问题其实在笔试中会经常遇到的1个题目。对于在Python中读取文件的操作,一般我们会这样来操作:

    f = open('filename','rb')
    f.read()

    下面我们来找1个比较大的文件,比如1个nginx的日志文件,记得之前有一次公司的1天的nginx日志文件解压为3GB大小,不得不对其进行切分。

    发现问题

    这里我们找到了1个3G大小的文件。接下来,我们使用普通的读取方式来查看该文件的内容:

    f=open('test','rb')
    data=f.read()
    ---------------------------------------------------------------------------
    MemoryError                               Traceback (most recent call last)
    ...
    MemoryError: 

    我们可以看到1个MemoryError的错误,说明该无文件无法被装载在内存中发生溢出了。下面我们来思考下为什么内存会溢出了,在我们打开文件的时候并没有发生任何异常,而在我们调用read方法时才出现问题。我们知道,文件对象的read方法会尝试将所有内容以1行的形式读入,显然这种方式对于大文件是不可行的。

    解决方案

    在Python中,除了使用read方法读取文件内容外,还有另外2个方法readline和readlines也可以进行内容的读取。既然默认read方法是一次性的将内容都读取到内存中,那么我们是否可以指定其每次读取的长度来解决这个问题呢?

    data = f.read(1024)
    while 1:
      #处理该行的代码
      data = f.read(1024)

    而readlines会返回每1行读取的内容的列表,因此有一定风险的。

    for l in f.readlines():
       #处理这1行的代码

    那么,我们每次读取1行总可以了把。这样我们可以通过如下的方式来进行:

    line = f.readline()
    while 1:
        #处理该行的代码
        line = f.readline()

    我们通过1个无限循环的方式来进行读取。结果发现,使用readlines的方式还是会导致内存不足的情况发生,而通过读取指定字节的方式则可以处理完这个文件。

    在上面的解决方案中,我们需要手动处理文件读取的大小,并在合适的情况退出读取的操作。

    那么,我们有没有更好的解决方案呢?实际上是有的,在Python的手册中,有1个xreadlines的方法,这个方法就类比range和xrange函数的区别。这个方法返回类似 iter(f) 的字符串,但是遗憾的是该方法在Python版本2.3中已经被淘汰了,官方建议我们使用for语句来替代:

    for line in f:
        #处理该行的代码

    通过这种方式,Python将处理文件对象为1个迭代器,并自动使用缓存IO和内存管理,这样我们就不需要关注大的文件了。

    参考文件:

    展开全文
  • 帮妹子处理一个2.xG 大小的 csv文件文件太大,不宜一次性读入内存,可以使用open迭代器。with open(filename,'r') as file# 按行读取for line in file:process或者简单点for line in open('myfile.txt','r'):pass...

    帮妹子处理一个2.xG 大小的 csv文件,文件太大,不宜一次性读入内存,可以使用open迭代器。

    with open(filename,'r') as file

    # 按行读取

    for line in file:

    process

    或者简单点

    for line in open('myfile.txt','r'):

    pass

    需求是,提取时间在指定时间段的数据,另存一个文件。

    全部代码如下

    def is_between_time(str, start, end):

    """

    :param str: a line in data file : 8684496663,粤BC5948,2016-01-01 22:01:56,114.083448,22.531582,225,0,0,0,114075022530,114070022530,114.078316,22.534267,1463910,2016-01-01 22:25:59.772000

    :param start: start point for example: 21:57:00

    :param end: end point for example: 22:03:00

    :return:

    """

    fields = str.split(',')

    datetime = fields[2]

    time = datetime.split(' ')[1]

    if time > start and time < end:

    return True

    else:

    return False

    file_to_read_path = "E:/P_CZCGPS_20160101.csv"

    file_to_write = open("E:/result.csv", 'w')

    # read file and process

    with open(file_to_read_path,'r') as file:

    for line in file:

    if is_between_time(line, "21:57:00", "22:03:00"):

    print(line)

    file_to_write.write(line)

    file_to_write.close()

    1024节日快乐!

    展开全文
  • Python 读取文件

    万次阅读 2017-10-11 18:18:49
    在处理大数据时,有可能会碰到好几个 G 大小文件。如果通过一些工具(例如:NotePad++)打开它,会发生错误,无法读取任何内容。 那么,在 Python 中,如何快速地读取这些大文件呢?
  • 创建一个3G大小的word文件,创建方法参考:如何快速生成一个指定大小的txt、word文件 import datetime f = open(r'C:\Users\songlihui\PycharmProjects\test002django\apps\1.doc') t = open(r'C:\Users\songlihui...
  • 我现在有一个APK,可以用7-zip打开,看到里面每个文件...如何才能使用命令行读取到每个子文件压缩后的大小? 求大神指点! [img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/onion/1.gif][/img]
  • 使用Python读取文件

    2019-11-22 14:55:24
    今天有个朋友问了我一个问题,如何使用Python读取文件?觉得这个问题挺有意思的,就记录下来。 大部分时间我们处理小文件的时候(1g以内?),可以直接用f.read()或readlines()直接把全部内容读取到内存里面来。但...
  • 实例1:获取指定目录下所有的文件大小,并找出最大文件及最小文件 分解步骤: 遍历文件夹下所有的子文件及子文件夹(需要递归),并计算每一个文件的大小 计算所有文件的大小总和 找出最大文件及最小文件 核心代码 ...
  • 使用python读取文件

    2019-03-07 15:03:26
    在用python做机器学习的时候,有时候训练或测试数据特别大,一个文件就有几个G,如何高效读取,不使机器内存爆炸呢,以我自己的工作经历来说,读取一个特别大的二进制文件来做测试,有几个G的大小,但每次只测batch ...
  • import matplotlib.pylab as pylab def loaddata(filename): ...用这个程序读取文件后绘图结果科学计数表示的数字无法自动分辨大小 ![图片说明](https://img-ask.csdn.net/upload/201810/29/1540792031_60721.png)
  • 因为压缩之后,不仅会减少一个文件大小,还可以把需要传输的文件数降到最低(1 个),这样很适合网络传输。压缩包也称为归档包。 利用 zipfile 模块中的函数, 我们就可以创建或解压 ZIP 文件。 1 创建 ZIP 文件 ...
  • python文件操作中如何用4G内存读取5G数据? 方法一: 可以通过生成器,分多次读取,每次读取数量相对少的数据(比如500MB)进行处理,处理结束后 在读取后面的 500MB的数据。 方法二: 可以通过linux命令split切割...
  • 我们知道,c中可以每次读取特定大小的空间的内容的方式来读取文本文件。而在python中好像不行python的方法只允许读取每一行或者全部内容。以上代码会出现如下的报错。 ...
  • 无论是日志文件还是配置文件都是我们日常运维中常见的类型,学习处理文件的关键是学会如何处理文本数据。Python 包含一个称为 file 的内建类型,可以用来处理文件。 创建文件对象 为了读取一个现有的文件,...
  • python读文件优化方案(总结) ...下面我将就python读取文件进行优化。 1.实验条件 1.操作系统: window 10 2.工具:python 3.6.3 3.数据大小:113MB 4.数据格式:20000行,每行1001个浮点数(以英文逗号...
  • 现在需要处理一个大小为10G文件,但是内存只有4G,如果在只修改get_lines 函数而其他代码保持不变的情况下,应该如何实现?需要考虑的问题都有那些?
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
  • python-18-如何文件映射到内存?

    千次阅读 2017-05-05 16:23:06
    当我们使用read读取文件时可以使用seek来定位指针。但是如果是二进制文件,定位读取就是一个难题了。 方案: 使用dd命令创建一个1MB大小内容为0的文件; 然后我们对该文件进行映射import mmap mmap.mmap 在不同...
  • 在很多时候,我们都需要使用Python对某个文件夹下的文件进行文件名排序读取,如下图1就是一种按照文件名中数字的值大小进行的排序,这是Windows系统下的文件夹自然的排序方式。 然而,当我使用Python对其直接进行...
  • 如果你有个5、6 G 大小文件,想把文件内容读出来做一些处理然后存到另外的文件去,你会使用什么进行处理呢?不用在线等,给几个错误示范:有人用multiprocessing 处理,但是效率非常低。于是,有人用python处理大...
  • 读取一个简单的ASCII文件 如何处理特殊行(注释,标题) 古典方式 使用numpy.loadtxt 使用numpy.genfromtxt 处理丢失的数据 固定大小格式的数据 写文件 简单的方法 泡菜文件Python格式) FITS文件 简单情节 ...
  • 了解如何捕获视频 了解waitkey的使用方法 二、了解opencv的图像属性 2.1 图像的属性 在我们获取到图像后,可以获取到图像的大小、类型以及通道等信息;通道指的是RGB这三个颜色通道,一幅完整的图像是由单独的红色...

空空如也

空空如也

1 2 3 4
收藏数 77
精华内容 30
关键字:

python如何读取文件大小

python 订阅