Kri*_*zne 27 python utf-8 cp1252 windows-1252 python-unicode
好吧,因为标题表明我遇到的问题是正确地从python中的Windows-1252编码文件中读取输入并将所述输入插入到SQLAlchemy-MySql表中.
当前系统设置:
带有"Roger访问控制系统"的Windows 7 VM,用于输出文件;
Ubuntu 12.04 LTS VM具有Windows系统的共享文件夹,因此我可以使用"Python 2.7.3"访问该文件.
现在针对实际问题,对于输入文件,我有一个"VM共享文件夹",其中包含通过Roger访问控制系统(roger.pl获取更多详细信息)在Windows 7系统上生成的文件,此文件称为" PREvents.csv"暗示它的内容,";" 分离的数据清单.
数据的示例格式:
2013-03-19;15:58:30;100;J?nis;Dumburs;1;Uznemums1;0;Ieeja;
2013-03-19;15:58:40;100;J?nis;Dumburs;1;Uznemums1;2;Izeja;
Run Code Online (Sandbox Code Playgroud)
第4个字段包含卡所有者名称,第5个字段包含所有者姓氏,第6个字段包含所有者分配的组.
问题来自于上述3个字段中的任何一个都可以包含特定于拉脱维亚语言的字符,在示例文件中,单词"Jānis"包含字母"ā",其在unicode中为257.
就像我习惯的那样,我打开文件:
try:
f = codecs.open(file, 'rb', 'cp1252')
except IOError:
f = codecs.open(file, 'wb', 'cp1252')
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切正常 - 它打开文件,所以我继续迭代文件的每一行(这是一个连续运行脚本,所以原谅循环):
while True:
line = f.readline()
if not line:
# Pause loop for 1 second
time.sleep(1)
else:
# Split the line into list
date, timed, userid, firstname, lastname, groupid, groupname, typed, pointname, empty = line.split(';')
Run Code Online (Sandbox Code Playgroud)
这就是问题开始的地方,如果我print repr(firstname)打印的话u'J\xe2nis',就我而言,不正确 - "\ xe2 \"不代表拉脱维亚字符"ā".
根据事件类型进一步向下循环我将变量分配给SQLAlchemy对象并插入/更新:
if typed == '0': # Entry type
event = Events(
period,
fullname,
userid,
groupname,
timestamp,
0,
0
)
session.add(event)
else: # Exit type
event = session.query(Events).filter(
Events.period == period,
Events.exit == 0,
Events.userid == userid
).first()
if event is not None:
event.exit = timestamp
event.spent = timestamp - event.entry
# Commit changes to database
session.commit()
Run Code Online (Sandbox Code Playgroud)
在我搜索答案时,我发现了如何定义要使用的默认编码:
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
Run Code Online (Sandbox Code Playgroud)
这对我没有任何帮助.
基本上,这一切都导致我无法插入正确的所有者名字和姓氏以及所有者指定的组名,如果它们包含任何特定于拉脱维亚语的字符,例如:
Instead of the character "?" it inserts "â"
Run Code Online (Sandbox Code Playgroud)
我还想补充一点,我无法更改"PREvents.csv"文件编码,"RACS"系统不支持插入UTF-8或Unicode文件 - 如果您尝试任何一种方式,系统会插入随机符号拉脱维亚语特有的字符.
如果需要任何其他信息,请现在让我,我很乐意提供:)
任何帮助将受到高度赞赏.
phi*_*hag 21
CP1252不能代表ā; 你的输入包含类似的字符â.repr只显示Python 2.x中unicode字符串的ASCII表示:
>>> print(repr(b'J\xe2nis'.decode('cp1252')))
u'J\xe2nis'
>>> print(b'J\xe2nis'.decode('cp1252'))
Jânis
Run Code Online (Sandbox Code Playgroud)
我对一些 XML 文件遇到了同样的问题,我解决了使用 ANSI 编码(Windows-1252)读取文件并使用 UTF-8 编码写入文件:
import os
import sys
path = os.path.dirname(__file__)
file_name = 'my_input_file.xml'
if __name__ == "__main__":
with open(os.path.join(path, './' + file_name), 'r', encoding='cp1252') as f1:
lines = f1.read()
f2 = open(os.path.join(path, './' + 'my_output_file.xml'), 'w', encoding='utf-8')
f2.write(lines)
f2.close()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
58188 次 |
| 最近记录: |