搜索
bottom↓
回复: 17
打印 上一主题 下一主题

用Python逐行复制文件,为什么会丢行?

[复制链接]

出0入18汤圆

跳转到指定楼层
1
发表于 2024-7-6 20:18:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 smbxfdbz 于 2024-7-6 20:48 编辑

一共就四行代码,文件打开后逐行复制,文件一共21万行,运行完打开发现前面都没问题,后面有几百行丢了,这会是什么原因呢?

代码如下

readfilea = open("a.ini", 'r')
samefile = open("b.ini", 'w')

while True:
    linefilea = readfilea.readline()
    samefile.writelines(linefilea)

a.ini,b.ini对比截图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出200入2554汤圆

2
发表于 2024-7-6 20:25:58 来自手机 | 只看该作者
b 文件也用 r 模式?

出0入18汤圆

3
 楼主| 发表于 2024-7-6 20:27:59 | 只看该作者
本帖最后由 smbxfdbz 于 2024-7-6 20:29 编辑


这是文本文件,不是bin文件哦
只有四行代码,感觉完全不应该有问题呀,好奇怪

出200入2554汤圆

4
发表于 2024-7-6 20:44:27 来自手机 | 只看该作者
smbxfdbz 发表于 2024-7-6 20:27
这是文本文件,不是bin文件哦
只有四行代码,感觉完全不应该有问题呀,好奇怪
...

(引用自3楼)

我是指写入的话,不得用 w 之类的模式?

不过我不懂 python,全靠猜

出0入18汤圆

5
 楼主| 发表于 2024-7-6 20:48:56 | 只看该作者
t3486784401 发表于 2024-7-6 20:44
我是指写入的话,不得用 w 之类的模式?

不过我不懂 python,全靠猜
(引用自4楼)

是w的,笔误

出15入70汤圆

6
发表于 2024-7-6 20:49:36 来自手机 | 只看该作者
t3486784401 发表于 2024-7-6 20:44
我是指写入的话,不得用 w 之类的模式?

不过我不懂 python,全靠猜

(引用自4楼)


对啊,两个都是读,能写进去吗

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入18汤圆

7
 楼主| 发表于 2024-7-6 20:57:31 | 只看该作者
jadegu 发表于 2024-7-6 20:49
对啊,两个都是读,能写进去吗
(引用自6楼)

程序里是w的,能写进去,只是我复制到帖子里的时候,不小心改到那里了

出0入0汤圆

8
发表于 2024-7-6 22:08:05 | 只看该作者
smbxfdbz 发表于 2024-7-6 20:57
程序里是w的,能写进去,只是我复制到帖子里的时候,不小心改到那里了
(引用自7楼)

这种就在循环中插入打印的语句,复制完就打印,然后写入,看看为什么中断了。

出0入663汤圆

9
发表于 2024-7-6 22:59:01 | 只看该作者
你while True是怎么终止程序的?

出0入18汤圆

10
 楼主| 发表于 2024-7-7 06:10:20 来自手机 | 只看该作者
gzhuli 发表于 2024-7-6 22:59
你while True是怎么终止程序的?
(引用自9楼)

我想着只是测试,手动点一下停止就行了
确实是这个问题,加上break条件就会正常就

出280入168汤圆

11
发表于 2024-7-7 06:56:06 | 只看该作者
你没有 close 文件。

出0入328汤圆

12
发表于 2024-7-7 07:00:27 来自手机 | 只看该作者
Python虽简单,但楼主你代码写得更随意

出0入328汤圆

13
发表于 2024-7-7 07:05:43 来自手机 | 只看该作者
建议用用ChatGPT,这种代码没必要浪费时间,包括写代码与bug排查

出280入168汤圆

14
发表于 2024-7-7 07:20:15 | 只看该作者
本帖最后由 chunjiu 于 2024-7-7 07:21 编辑

从 Python 3.7 开始,已经不需要显式调用 `close()`  函 来关闭文件对象了。 因为 Python 引入了自动资源管理,它会确保在文件对象超出作用域时自动关闭。

以下是一些使用自动资源管理的示例:

  1. # 使用 `with` 语句打开文件
  2. with open('example.txt', 'r') as f:
  3.   content = f.read()
  4.   print(content)

  5. # 使用 `try...finally` 语句块打开文件
  6. try:
  7.   f = open('example.txt', 'r')
  8.   content = f.read()
  9.   print(content)
  10. finally:
  11.   f.close()
复制代码


在以上示例中,即使没有显式调用 `close()` 函数,文件也会在语句块结束后自动关闭。

但是,在以下情况下,仍然建议显式调用 `close()` 函数:

* 在 **Python 3.7 之前的版本** 中。
* 需要在文件对象超出作用域之前**释放资源**,例如在使用 C 扩展模块时。
* 需要确保文件 **立即关闭**,例如在写入临时文件时。

总而言之,在 Python 3.7 及更高版本中,通常不需要显式调用 `close()` 函数来关闭文件对象。 但是,在某些情况下,仍然建议显式调用它。

出715入1076汤圆

15
发表于 2024-7-7 08:32:44 来自手机 | 只看该作者
要正常退出才行,强制终止会导致缓存丢失

出0入18汤圆

16
 楼主| 发表于 2024-7-7 08:45:12 来自手机 | 只看该作者
dukelec 发表于 2024-7-7 08:32
要正常退出才行,强制终止会导致缓存丢失
(引用自15楼)

是的,就是这个原因

出0入112汤圆

17
发表于 2024-7-7 08:57:18 | 只看该作者
本帖最后由 xunke 于 2024-7-7 09:01 编辑

我改了下,代码如下:
f1 = open('1.txt','r',encoding='utf-8')
f2 = open('2.txt','w+')

while t1 := f1.readline():
    print(t1)
    f2.write(t1)

f1.close()
f2.close()
第1行中的encoding='utf-8'根据需要增删。

出0入224汤圆

18
发表于 2024-7-7 10:45:17 来自手机 | 只看该作者
文件有打开,没有关闭?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-15 10:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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