我是一个Python新手.
我一直在寻找,但发现我的观念只有一点点.
Windows上的
Python 2.7(我选择了python,因为它是多平台,结果可以在Windows上移植).
我想创建一个脚本,在文件夹中搜索* .txt UTF-8文本文件,加载内容(一个文件在彼此之后),将非ascii字符更改为html权限,然后在开始时添加html标记并且在每一行的末尾,但是标签的两个变体,一个用于文件的头部,一个用于文件的尾部,其中(头尾)由空行分隔.之后,所有结果必须写入另一个文本文件,如* .htm.要视觉:
unicode1.txt:
űnícődé text line1
űnícődé text line2
[empty line]
űnícődé text line3
űnícődé text line4
结果必须在unicode1.htm中:
űnícődé text line1
űnícődé text line2
[empty line]
űnícődé text line3
űnícődé text line3
我开始开发我的解决方案的核心,但我坚持了下来.请参阅脚本版本(为简单起见,我选择使用xmlcharrefreplace进行编码).
V1:
import re, cgi, fileinput
file="_utf8.txt"
text=""
for line in fileinput.input(file, inplace=0):
line=cgi.escape(line.decode('utf8'),1).encode('ascii', 'xmlcharrefreplace')
line=re.sub(r"^", "
", line, 1)
text=text+re.sub(r"$", "
", line, 1)print text
它工作得很好,但是对于这个任务来说,fileinput不是我认为可行的方式.
V2:
import re, cgi, codecs
file="_utf8.txt"
text=""
f=codecs.open(file, encoding='utf-8')
for line in f:
line=cgi.escape(line,1).encode('ascii', 'xmlcharrefreplace')
line=re.sub(r"^", "
", line, 1)
text=text+re.sub(r"$", "
", line, 1)f.close()
print text
它搞砸了结果,在行开始时关闭标记替换第一个字母等.
V3(试过多行标志):
import re, cgi, codecs
file="_utf8.txt"
text=""
f=codecs.open(file, encoding='utf-8')
for line in f:
line=cgi.escape(line,1).encode('ascii', 'xmlcharrefreplace')
line=re.sub(r"^", "
", line, 1, flags=re.M)
text=text+re.sub(r"$", "
", line, 1, flags=re.M)f.close()
print text
结果相同.
V4(试过1个正则表达式而不是2个):
import re, cgi, codecs
file="_utf8.txt"
text=""
f=codecs.open(file, encoding='utf-8')
for line in f:
line=cgi.escape(line,1).encode('ascii', 'xmlcharrefreplace')
text=text+re.sub(r"^(.*)$", r"
\1
", line, 1)f.close()
print text
结果相同.请帮忙.
编辑:我刚用hexeditor检查结果文件,每个结束标记前都有一个x0D字节!为什么?
Edit2:更改为更合理的方法
text+=re.sub(r"^(.*)$", r"
\1
", line, 1)编辑3:使用hexeditor我看到了混乱结果的原因:每个CRLF之前的额外CR(x0D)字节.
我追踪了CR的问题,是什么造成的:串联起来
# -*- coding: utf-8 -*-
text=""
f=u"unicode text line1\r\n unicode text line2"
for line in f:
text+=line
print text
这导致:
unicode text line1\r\r\n unicode text line2
任何想法,如何解决这个问题?