鱼C论坛

 找回密码
 立即注册
查看: 2177|回复: 10

文本读取写入出现的问题,编码相关

[复制链接]
发表于 2017-5-18 12:01:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

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

x
本帖最后由 Cupidosarrow 于 2017-5-19 08:59 编辑

这个代码是我在学习文件读取和写入时写的,当时突发奇想能不能顺便把文件从一个编码转到另一个编码
效果就像用文本文档另存为的样子:
qq.png
(5.19:为防歧义改了图片)
于是改了改变成这样:

  1. import os
  2. f=open('first.txt','r',encoding='utf-16')
  3. r=open('second.txt','w')
  4. for eachword in f:
  5.     en=eachword.encode('utf-8')
  6.     en1=str(en)
  7.     r.write(en1)
  8. f=f.close()
  9. r=r.close()
复制代码


first.txt是文本文件,编码是utf-16,我想将他转换成utf8格式
转完之后就变成这样了
qq.png
这好像跟我想象的不一样,我本以为用utf-8编码打开文档之后就能看到直接可以阅读的文字,但是并不是,而是直接将文字对应的编码写进txt里了
是哪个地方出错了呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-5-18 15:37:37 | 显示全部楼层
第五行
  1. en=eachword.encode('utf-8').decode('utf-8')
复制代码

另外,大的编码里包含小的编码里没有的则会报错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-18 16:05:20 | 显示全部楼层
不同的编码不能直接转换
必须通过unicode中转一次
例如
gbk -> str -> utf8
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-18 21:12:37 | 显示全部楼层
SixPy 发表于 2017-5-18 16:05
不同的编码不能直接转换
必须通过unicode中转一次
例如

我试了另一个方法,这次成功了
我感觉我可能陷入了误区,要用特定的编码保存不一定非要转换编码,只需要在打开的时候设置好编码,直接写入就行了

  1. import os
  2. f=open('first.txt','r',encoding='utf-16')
  3. r=open('second.txt','w',encoding='utf-8_sig')
  4. r.write(f.read())
  5. f=f.close()
  6. r=r.close()
复制代码

用这个代码就能完成文本文档中“以另一个格式另存为”的功能了,这也是我一开始想要实现的结果
不知道为什么整个代码都没用到encode,也不知道是不是原本的思路错了,要实现这个结果并不需要对字符串进行编码,虽然做出了代码,但是仍然不知道原理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-18 22:32:54 | 显示全部楼层
Cupidosarrow 发表于 2017-5-18 21:12
我试了另一个方法,这次成功了
我感觉我可能陷入了误区,要用特定的编码保存不一定非要转换编码,只需要 ...

原理仍然是我说的那个
只是python内部帮你处理了而已
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-19 00:16:05 | 显示全部楼层
本帖最后由 Cupidosarrow 于 2017-5-19 00:17 编辑
SixPy 发表于 2017-5-18 22:32
原理仍然是我说的那个
只是python内部帮你处理了而已

import os
f=open('first.txt','r',encoding='utf-16')
r=open('second.txt','w')
for eachword in f:
    eachword=str(eachword)
    eachword=eachword.encode("utf-8")
    eachword=str(eachword)
    r.write(eachword)
f.close()
r.close()


如果是在转换中间加入中转变成这样,输出仍然是一楼的文本而不是四楼的,请问这是为什么呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-19 00:29:23 | 显示全部楼层
Cupidosarrow 发表于 2017-5-19 00:16
如果是在转换中间加入中转变成这样,输出仍然是一楼的文本而不是四楼的,请问这是为什么呢

我去,我是沙发,竟然不理我,难道我的方法不对吗?瞎整,打开的时候默认是有encoding的,除非你'rb'用二进制读取,知道不,默认情况下,打开就已经转换成字符串了,至于是gbk还是utf-8是跟你python版本有关!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-19 08:50:16 | 显示全部楼层
zxszx4 发表于 2017-5-19 00:29
我去,我是沙发,竟然不理我,难道我的方法不对吗?瞎整,打开的时候默认是有encoding的,除非你'rb'用二 ...

= =晕,没看到,不好意思
不过你的方法虽然转换出来没有乱码,文本本身却没有用utf-8编码,这个跟我想要实现的目的不一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-19 09:49:22 | 显示全部楼层
Cupidosarrow 发表于 2017-5-19 08:50
= =晕,没看到,不好意思
不过你的方法虽然转换出来没有乱码,文本本身却没有用utf-8编码,这个跟我想要 ...

你要实现啥目的???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-19 12:10:18 | 显示全部楼层
zxszx4 发表于 2017-5-19 09:49
你要实现啥目的???

主题里写了,想实现文本文档的转码另存为的效果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-19 16:00:01 | 显示全部楼层
Cupidosarrow 发表于 2017-5-19 12:10
主题里写了,想实现文本文档的转码另存为的效果

我感觉和没说一样,我的没有转码嘛?
encode还原成2进制
decode编码成了'utf-8'的字符型了,然后写到文件里了,还要怎么样算转码了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-28 16:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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