找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 3373|回复: 2

[讨论] Python按大小分割文本不截断行的方式有哪些?

4

主题

7

帖子

7

积分

贫民

积分
7
大牛牛 发表于 2018-4-8 17:58:59 | 显示全部楼层 |阅读模式
本帖最后由 大牛牛 于 2018-4-8 18:01 编辑

      问题描述:对一个大文本文件分割成多个小文件,参考网上很多方式都会出现将行内容截断的情况(见下面截图)。为了确保小文件的首行或尾行不产生截断,目前我想到的方式是:每读取一行文本判断一次文件是否超过指定大小,但这样效率很低(见示例代码)。           因此各位大神有没有更简洁、高效的方式??
大文本文件内容:
1.png

分割后的小文本1(尾行被截断了):
2.png


分割后的小文本2(首行被截断了):
3.png


  1. #coding:utf-8

  2. def split(filename, size):
  3.       strBuf=""   #充当临时缓冲区
  4.       i = 0       #用于控制文件名
  5.       cutfilename=r"D:\soft\wps\test-"
  6.       fp = open(filename, 'rb')
  7.       lines = fp.readline()
  8.    
  9.       while lines:
  10.              strBuf=strBuf+lines #拼接语句
  11.         
  12.              #字符缓冲区达到指定大小时写入文件,并清空缓冲区
  13.              if(len(strBuf) >= size):
  14.                      tempLog = open(cutfilename+str(i)+".log","wb")
  15.                      tempLog.write(strBuf)
  16.                      tempLog.close()
  17.                      strBuf=""
  18.                      i += 1
  19.             
  20.               lines = fp.readline()
  21.    
  22.      #将剩余的数据写入文件   
  23.      tempLog = open(cutfilename+str(i)+".log","wb")
  24.      tempLog.write(strBuf)
  25.      tempLog.close()
  26.      fp.close()   
  27.      
  28. if __name__ == '__main__':
  29.      name=unicode(r"D:\soft\wps\test.txt","utf-8")
  30.      split(name, 1024)        #单位为B
复制代码

这是代码达到的效果(
测试行保留完整未被截断
4.png





回复

使用道具 举报

0

主题

11

帖子

11

积分

贫民

积分
11
小数点儿 发表于 2018-4-8 23:07:32 | 显示全部楼层
  1. # coding:utf-8

  2. def split(filename, size):
  3.     strBuf = ""  # 充当临时缓冲区
  4.     i = 0  # 用于控制文件名
  5.     cutfilename = r"D:\soft\wps\test-"
  6.     fp = open(filename, 'rb')
  7.     lines = fp.read(size)
  8.     lines=lines+ fp.readline()


  9.     while lines:
  10.         strBuf = strBuf + lines  # 拼接语句
  11.         # 字符缓冲区达到指定大小时写入文件,并清空缓冲区
  12.         if True:
  13.             tempLog = open(cutfilename + str(i) + ".log", "wb")
  14.             tempLog.write(strBuf)
  15.             tempLog.close()
  16.             strBuf = ""
  17.             i += 1

  18.         lines = fp.read(size)
  19.         lines = lines + fp.readline()

  20.     # 将剩余的数据写入文件



  21.     fp.close()

  22. if __name__ == '__main__':
  23.     name = unicode(r"D:\soft\wps\test.txt", "utf-8")
  24.     split(name, 10)  # 单位为B
复制代码

貌似挺简单,不知还有什么方法
回复 支持 反对

使用道具 举报

4

主题

7

帖子

7

积分

贫民

积分
7
大牛牛  楼主| 发表于 2018-4-9 11:04:51 | 显示全部楼层
小数点儿 发表于 2018-4-8 23:07
貌似挺简单,不知还有什么方法

优化过的代码确实好简单,谢谢你!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表