Python论坛  - 讨论区

标题:[python-chinese] [OT] 关于往大文件中间插入文本。

2007年10月28日 星期日 14:04

Fluke fluke.l在gmail.com
星期日 十月 28 14:04:50 HKT 2007

ÎÒÒªÍù´óÎļþÀïÃæ²åÈëÎı¾¡£

¿Ï¶¨ÄÜÓõİ취£º

1. ÖØÐÂдһ¸öÁÙʱÎļþ£¬°´ÕÕ˳ÐòÒ»±ß¶ÁÈ¡¾ÍÎļþÒ»±ß×éºÏµ½ÐµÄÎļþ¾ÍÐÐÁË¡£
2. ¶ÁÈ¡ÎļþÄ©¶Îµ½Äڴ棬ÖмäдÈëÒª²åÈëµÄÄÚÈÝ£¬È»ºó½Ó×ŰѸղŶÁÈ¡µÄÄÚÈÝдÈë¡£
3. ÄÚ´æÓ³Éä¡£

ÒòΪÎļþ´ó£¬ËùÒÔ²»ÍƼö2ºÍ3¡£

ÎÒ³¢ÊÔÁËÀàËÆ1µÄ·½·¨£¬²»¹ý²»Ð´ÐÂÎļþ£¬Á÷³ÌÈçÏ£º

fseekµ½²åÈëµãpos_ins£¬Íùºó¶ÁÈ¡Ò»¶Î±ÈÈç buf[BUFSIZE](ÕâÀïBUFSIZE´óÓÚÒª²åÈëµÄÄÚÈÝ)£¬

    È»ºóseek»Øµ½¸Õ²ÅµÄµØ·½pos_ins£¬Ð´ÈëÄÚÈÝ.

    È»ºófseekµ½ pos_ins+BUFLEN£¬ÔÙ¶ÁÈ¡ buf[BUFLEN]£¬

    ½Óׯص½ pos_ins = ins_lenÈ¥£¬Ð´Èëbuf

Èç´ËÑ­»·¡£

×ܵÄÀ´Ëµ£¬¾ÍÊÇÒ»±ß¶ÁÈ¡ºóÃæµÄ²¿·Ö£¬Ò»±ßÍùÇ°Ãæд¡£´ïµ½Éú³ÉÐÂÎļþµÄÄ¿µÄ¡££¨×îºó¿ÉÄÜÐèÒªÓÃÎļþϵͳµÄÏà¹Øµ÷ÓÃÀ´ÐÞ¸ÄÒ»ÏÂÎļþ´óС£©¡£

ÎÒ·¢ÏÖÕâÑù×ö²»ÐС£Ô­ÒòºÃÏñÊÇÒòΪÎÒÒ»µ©¶ÁÈ¡Ò»´ÎÒÔºó£¬ÎļþµÄÆðʼָÕëÒѾ­²»ÄÜÔٻص½ÎļþÍ·ÁË£¨rewind»òÕßfseek(pos,SEEK_SET)µÄÆðʼµãÔڸղŶÁÈ¡µÄÄÚÈݺóÃ棩¡£
 Îļþio¿ØÖÆÎÒÓõÄÊÇ "rw" ¡£

ÊDz»ÊÇ¿ªÒ»¸öÎļþ²»ÄÜͬʱ¶Áд£¿


-- 
Yours,
  fluke
fluke在sfcube.net
http://blog.ospattern.net
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20071028/6a8fddd5/attachment.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年10月28日 星期日 17:40

Cyril.Liu terry6394在gmail.com
星期日 十月 28 17:40:14 HKT 2007

想法是可行的。 你是在说C吗?! python的I/O模式,如果你要读又要写的话是要用 "r+"的。 我写个函数试试看。

On 10/28/07, Fluke <fluke.l at gmail.com> wrote:
>
> 我要往大文件里面插入文本。
>
> 肯定能用的办法:
>
> 1. 重新写一个临时文件,按照顺序一边读取就文件一边组合到新的文件就行了。
> 2. 读取文件末段到内存,中间写入要插入的内容,然后接着把刚才读取的内容写入。
> 3. 内存映射。
>
> 因为文件大,所以不推荐2和3。
>
> 我尝试了类似1的方法,不过不写新文件,流程如下:
>
> fseek到插入点pos_ins,往后读取一段比如 buf[BUFSIZE](这里BUFSIZE大于要插入的内容),
>
>     然后seek回到刚才的地方pos_ins,写入内容.
>
>     然后fseek到 pos_ins+BUFLEN,再读取 buf[BUFLEN],
>
>     接着回到 pos_ins = ins_len去,写入buf
>
> 如此循环。
>
> 总的来说,就是一边读取后面的部分,一边往前面写。达到生成新文件的目的。(最后可能需要用文件系统的相关调用来修改一下文件大小)。
>
> 我发现这样做不行。原因好像是因为我一旦读取一次以后,文件的起始指针已经不能再回到文件头了(rewind或者fseek(pos,SEEK_SET)的起始点在刚才读取的内容后面)。
>  文件io控制我用的是 "rw" 。
>
> 是不是开一个文件不能同时读写?
>
>
> --
> Yours,
>   fluke
> fluke at sfcube.net
> http://blog.ospattern.net
> _______________________________________________
> python-chinese
> Post: send python-chinese at lists.python.cn
> Subscribe: send subscribe to python-chinese-request at lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request at lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://python.cn/pipermail/python-chinese/attachments/20071028/77989ef3/attachment.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号