我正在编写一个程序,用一个简短的python脚本"手动"安排一个csv文件,使其成为正确的json语法。从输入文件中,我使用readlines()将文件格式化为一个行列表,然后将其操作并集中到一个字符串中,然后将该字符串输出到一个单独的.txt文件中。但是,输出包含输入文件中出现的乱码而不是希伯来文字符,并且输出是两倍行距的水平(在每个字符之间添加一个空格字符)。据我所知,问题与编码有关,但我还没弄清楚是什么。当我检测到输入和输出文件的编码(使用.encoding属性)时,它们都返回None,这意味着它们使用系统默认值。技术细节:python 2.7、windows 7。

虽然有很多关于这个话题的问题,但我没有找到我的问题的直接答案。在这种情况下,检测系统默认值对我没有帮助,因为我需要可移植的程序。

代码如下:

def txt_to_JSON(csv_list):

...some manipulation of the list...

return JSON_string

file_name ="input_file.txt"

my_file = open(file_name)

# make each line of input file a value in a list

lines = my_file.readlines()

# break up each line into a list such that each 'column' is a value in that list

for i in range(0,len(lines)):

lines[i] = lines[i].split("\t")

J_string = txt_to_JSON(lines)

json_file = open("output_file.txt","w+")

json_file.write(jstring)

json_file.close()

值得注意的是,在使用python中的文件时,最好使用with语句。

你知道输入文件的编码是什么吗?

@他在读希伯来文字符,但他在程序中使用的是ASCII码。这很可能是问题所在。

什么版本的python?

通常,python采用的是ascii,在处理用其他编码编码的文件时,必须指定输入编码和输出编码。(听起来有点滑稽:d)

@保罗布:我不知道输入编码,正如我所说(也许我的编辑是在你的评论之后),我需要它是可移植的。

如果我使用的字符串是Unicode。也就是说,它已经被编码了,但我不知道编码是什么。如果是检测编码的问题,我理解这是一个棘手和不确定的业务,特别是因为这个程序可以在各种平台上使用,等等。

用notepad打开输入文件,选择另存为…,在编码所在的弹出窗口底部,选择utf-8,保存文件。现在您知道您的输入文件是utf8(它应该保持希伯来文字符的完整性),然后尝试使用该输入再次运行所有进程。如果它不起作用,请添加一个输入文件的简短示例,尝试在这里解析它,看看我是否可以。我还有windows/python2.7

@保罗布,我希望这能在任何系统上运行。另外,我在这个程序上做测试的指导是使用一个保存为Unicode的文件,而不是UTF-8。

@jeg622 unicode是一种超集编码。UTF-8是最标准化的编码的实现。python的unicode字符串在内部使用utf-8。这就是为什么我要用UTF-8保存文件的原因。为了在所有系统中都能工作,您必须至少在一个系统中工作。我们将在没有系统特定指令的情况下编写代码,但首先我们必须了解问题所在。

@paulobu如果我将输入文件保存为utf-8,它会很好地工作!但是,有人指示我使用一个保存为Unicode的文件。我将询问我的团队领导关于这项指示的问题,并回复给你。

我很高兴。如果你想向你的领导解释一些背景知识,这些链接将非常有用,特别是第一个:joelonsoftware.com/articles/unicode.html、stackoverflow.com/questions/3951722/…和stackoverflow.com/questions/643694/utf-8-vs-unicode

所有数据都需要编码才能存储在磁盘上。如果你不知道编码,你能做的最好的就是猜测。这里有一个库:https://pypi.python.org/pypi/chardet

我强烈推荐内德·巴切尔德的演讲http://nedbatchelder.com/text/unipain.html详情。

有一个关于在Windows上使用"unicode"作为编码的解释:unicode和utf-8有什么区别?

TLDR:微软使用UTF16作为Unicode字符串的编码,但决定称之为"Unicode",因为他们也在内部使用它。

即使python2在字符串/unicode转换方面有点宽松,您也应该习惯于在输入时解码,在输出时编码。

以你为例

filename = 'where your data lives'

with open(filename, 'rb') as f:

encoded_data = f.read()

decoded_data = encoded_data.decode("UTF16")

# do stuff, resulting in result (all on unicode strings)

result = text_to_json(decoded_data)

encoded_result = result.encode("UTF-16")  #really, just using UTF8 for everything makes things a lot easier

outfile = 'where your data goes'

with open(outfile, 'wb') as f:

f.write(encoded_result)

谢谢你的意见。但是,当我这样做时,输出文件(由f.write()创建)仍然被编码为ansi,所以当它到达希伯来文字符时,我会得到unicodeencodeerror。顺便说一句,utf_16是正确的符号。

在您的链接之后,我将编码从'utf_16'改为'utf_16_le',并得到了一个类似的错误,只与文件的开头有关,而不是与非ASCII字符有关。

你用什么程序打开输出文件?

我使用记事本。这将如何影响编码?

程序必须对文件进行解码以解释其中的内容。你能把这两个文件,或者类似的文件放在某个地方吗?我想看看

在一些额外的游戏之后(只是为了更好地了解正在发生的事情),我得出了额外的结论:1。将文件保存为"unicode",将codecs.open()与utf_16或utf_16_le一起用作编码,产生的结果类似于保存为"utf-8",并使用open()打开文件,唯一的区别是,当我将文件保存为"unicode"时,输出文件没有任何换行符2。使用codecs.open()与str.encode()有根本不同,但我不太明白为什么。

对于记录,这是输入文件。这个乱七八糟的文件可以在这里找到,尽管在我的电脑上,这个乱七八糟的文件看起来不一样,而且整个文件的间隔是两倍。正确的文件如下所示。出于某种原因,当我将文件上载到驱动器时,所有选项卡都消失了。

那么你有没有设法解决你的问题?

codecs.open使用编码在读取时对文件中的数据进行解码,在写入时对其进行编码。所以在代码中,您只有Unicode字符串。它相当于f = open('filename', 'r+'); s = f.read().decode(encoding)和后来的f.write(s.encode(encoding)),所以u"asdf"。编码只是功能的一半。

是的,谢谢你的帮助,现在一切都很好!

您需要告诉python使用Unicode字符编码来解码希伯来语字符。下面是一个如何在python中读取unicode字符的链接:在python中从文件中读取字符

对不起,我没有找到解决办法。我尝试使用codecs模块,但输出没有任何变化。

python 写入文件编码_使用Python写入文本文件时的编码问题相关推荐

  1. python 移动文件语句_[转]Python文件操作

    这里的"文件"不单单指磁盘上的普通文件,也指代任何抽象层面上的文件.例如:通过URL打开一个Web页面"文件",Unix系统下进程间通讯也是通过抽象的进程&qu ...

  2. python 输出文件分隔符_使用Python文件读写,自定义分隔符的方法

    使用Python文件读写,自定义分隔符的方法 发布时间:2020-07-06 11:07:56 来源:亿速云 阅读:121 作者:清晨 小编给大家分享一下使用Python文件读写,自定义分隔符的方法, ...

  3. python定位文件位置_在Python中定位文件位置

    tell()方法告诉您文件中的当前位置:换句话说,下一次读取或写入将发生在从文件开头开始的那么多个字节处. seek(offset [,from])方法更改当前文件位置.offset参数指示要移动的字 ...

  4. 如何用python新建文件夹_用Python编写一个每天都在系统下新建一个文件夹的脚本...

    这个程序的功能非常的简单,就是每天在系统中新建一个文件夹.文件夹即当前的时间.此代码是在同事那边看到的,为了锻炼下自己薄弱的Python能力,所以花时间重新写了一个.具体代码如下: import ti ...

  5. python 改文件名字_【Python】按要求修改文件名

    1.需求描述 在D:\Files下有以下文件,如下图: 要求: 将Logan开头的文件名全部修改为工作文档 其他的文件名称全部添加前缀"工作文档_" 实现后的结果如下: 2.实现代 ...

  6. python替换文件内容_使用python替换文件内容

    # 传入文件(file),将旧内容(old_content)替换为新内容(new_content) def replace(file, old_content, new_content): conte ...

  7. python 如何把 utf - 8 字符串写入文件中_心若止水_百度空间

    python 如何把 utf - 8 字符串写入文件中_心若止水_百度空间 python 如何把 utf - 8 字符串写入文件中_心若止水_百度空间 python 如何把 utf - 8 字符串写入 ...

  8. 字典(JSON)数据写入文件并换行,Python

    字典(JSON)数据写入文件并换行,Python import jsonif __name__ == '__main__':dict_data = {"one": 1, " ...

  9. python打开鼠标指定文件夹_学会python文件操作,鼠标好像没用了,学习python第10天...

    电影是人类对未来的向往,在<黑客帝国>中,我们看到了一个数字化的社会,而当你学会python文件操作,你也就离你向往的黑客近一点了,用程序来直接影响电脑上的其他文件,只需要几行代码就搞定. ...

  10. php写入文件内容方法,学习php写入文件内容的方法

    在PHP网站开发中,存储数据通常有两种方式,一种以文本文件方式存储,比如txt文件,一种是以数据库方式存储,比如Mysql,相对于数据库存储,文件存储并没有什么优势,但是文件读写操作在基本的PHP开发 ...

最新文章

  1. 关于“插入图片”等功能无法使用的问题
  2. 【学习笔记】23、读写文件(I/O操作)— 写文件
  3. 先进pid控制matlab仿真程序,先进PID控制Matlab仿真第4版-仿真程序-上交
  4. Ubuntu下安装Chrome浏览器的两个方法
  5. TP框架多上传域上传图片
  6. 设计模式-建造者模式(Builder Pattern)
  7. sql server期中综合练习
  8. mysql key键_mysql KEY是什么键?有什么作用?
  9. 计算机科学导论第12版答案,计算机科学导论第12章参考答案
  10. 【一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成】
  11. 因果图法测试中国象棋马
  12. 花呗接入央行征信系统!会影响贷款吗?
  13. MongoDB Bulk write operation error on server duplicate key error问题解决
  14. Android ijkplayer播放rtsp直播流
  15. 虚拟服务器的克隆,怎么克隆远程服务器上的虚拟机
  16. Python3中正则表达式使用方法
  17. TCP-IP详解卷一(一)概述
  18. Qt:QTableView(01) 的用法
  19. 迟到的 2019 年个人总结
  20. python判断当前时间为星期几

热门文章

  1. Spring框架学习笔记08:基于Java配置方式使用Spring MVC
  2. 【codevs1316NOIP2012PJ】文化之旅,无题
  3. 导致大量kworker的原因_氨氮超标的几种原因及解决办法
  4. vb mysql边记录边统计_vb6 数据库 增加记录
  5. bzoj1228 [SDOI2009]ED 找规律
  6. 2017.10.15 旅行comf 失败总结
  7. Intel 64/x86_64/IA-32/x86处理器 - 通用指令(9/E) - 比特位操控指令(BMI1 BMI2)
  8. strace 简单用法
  9. C语言中字母转换问题
  10. Websocket服务器响应包,服务器websocket c++发送二进制类型包,客户端没有任何事件响应...