V2EX 首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
V2EX  ›  Python

Python 中 open 函数的 read(size)方法如何循环

  •  
  •   onice · 4 天前 · 465 次点击

    直接调用 read 函数是读取所有文件到内存中。

    但是函数中可以加一个整数,表示从文件中读入多少字节文件。

    如果文件过大,直接用 read 读感觉会撑爆内存。但是用 read(1024)读吧,又要读取多次。肯定要使用循环。

    但是循环该如何写呢?例如下面的例子:

    with open("D:/source.exe", 'rb') as f_in:
    	with open("D:/target.exe", 'wb') as f_out:
        	#使用 read(size)函数希望把 D:/source.txt 复制到 D:/target.exe
    
    第 1 条附言  ·  4 天前
    感谢各位大大指点。其实 open 打开的文件返回对象是一个可迭代对象,直接用 for 迭代就能处理大文件了。
    参考: https://stackoverflow.com/questions/8009882/how-to-read-large-file-line-by-line-in-python
    6 回复  |  直到 2017-11-15 09:47:31 +08:00
        1
    n2ex2   4 天前 via Android
    .seek()
        2
    Trim21   4 天前
    这个思路不行吗?楼主的疑问是从哪里来的..

    with open('f1') as f_in:
    ....with open('f2') as f_out:
    ........for x in range(1, size_of_f_in, 1024):
    ............content = f_in.read(1024)
    .............append_to_file_out(content)
        3
    Trim21   4 天前   ♥ 1
    刚刚随手写的,size_of_file_in 随手写一个比 f_in 大的都可以,跑了下 md5 是一样的

    with open('page.db.bak', 'rb') as f_in:
    with open('f2', 'wb') as f_out:
    for x in range(1, 1000000000, 100):
    content = f_in.read(100)
    f_out.write(content)
        4
    cy97cool   4 天前 via Android
    直接死循环读就行 读到空字符串就 break
        5
    hjuj91   4 天前
    用 pipe redirect 不行么。。
        6
    NoAnyLove   4 天前
    readline 需要换行符界定一行,如果一行太长了,可以这么做:

    from functools import partial

    with open('1.in', 'rb') as f_in, open('1.out', 'wb') as f_out:
    ....read_iter = iter(partial(f_in.read, 1024), b'')
    ....for block in read_iter:
    ........f_out.write(block)
    DigitalOcean
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   1565 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.0 · 45ms · UTC 05:09 · PVG 13:09 · LAX 21:09 · JFK 00:09
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1