Python插入不需要的字符

时间:2013-06-24 21:09:20

标签: python html regex html-table import-from-csv

我正在尝试使用Python生成一组HTML表格,其中包含从CSV中提取的值。该脚本工作正常,但无论何处拉入值,它都会添加奇怪的“¬†”字符。

这是我用来抓取CSV数据的代码:

import csv
import fileinput
import re

out=open("audiencestats.csv","rU")
data=csv.reader(out)
values =[row for row in data]
metrics = values.pop(0) 
out.close()

这创建了一个制作html表的函数:

def maketable(leftmetric, rightmetric, leftvalue, rightvalue):
  template = '''
  <table width="99%%" border="1"> 
   <tbody>
    <tr>
    <td align="center" valign="middle">
    <h3>%s</h3>
    </td>
    <td align="center" valign="middle">
    <h3>%s</h3>
    </td>
    </tr>
    <tr>
    <td align="center" valign="middle"> %s</td>
    <td align="center" valign="middle"> %s</td>
    </tr>
    </tbody>
  </table>
  '''
  file.write(template % (leftmetric, rightmetric, leftvalue, rightvalue))

然后将表写入文本文件:

for i in values:
  filename = "%s.txt" % i[0]
  file = open(filename , 'w')
  file.write(header)
  maketable(metrics[1],metrics[2],i[1],i[2])
  maketable(metrics[3],metrics[4],i[3],i[4])
  maketable(metrics[5],metrics[6],i[5],i[6])
  maketable(metrics[7],metrics[8],i[7],i[8])
  maketable(metrics[9],metrics[10],i[9],i[10])
  maketable(metrics[11],metrics[12],i[11],i[12])
  file.write(header2)
  print makesocial(i[13],i[14],i[15])
  file.close()

我尝试在下面的re.sub中加入for循环,但十字架仍然存在。

for line in fileinput.input(inplace=1):
    line = re.sub(' ','', line.rstrip())
    print(line)

我错过了什么吗?我的电脑是否有宗教信仰?

以下复制的输出示例:

<h1>Audience</h1>
  <table width="99%" border="1"> 
   <tbody>
    <tr>
    <td align="center" valign="middle">
    <h3>UVs (000)</h3>
    </td>
    <td align="center" valign="middle">
    <h3>PVs (000)</h3>
    </td>
    </tr>
    <tr>
    <td align="center" valign="middle"> 580.705</td>
    <td align="center" valign="middle"> 1003</td>
    </tr>
    </tbody>
  </table>

3 个答案:

答案 0 :(得分:0)

你仍然没有回答我要求澄清的问题,所以我想在这里猜一下。

首先,re.sub不起作用的原因是您的模式是UTF-8 ¬†'\xc2\xac\xe2\x80\xa0'),但您尝试匹配cp1252 {{ 1}}(¬†)。显然,那些不匹配。

其次,你首先得到垃圾的原因是你的CSV文件正在由不使用UTF-8的东西处理,即使你认为它是。也许这是您的电子表格程序,文本编辑器或命令行工具。

最有可能的是,你只是将一个8位编码与链上的某个步骤混合在一起 - 写出一些文本为cp1252,然后尝试将其编辑为UTF-8,反之亦然。

'\xac\x86'非常有趣。这是U + 2020。如果您有一些UTF-16-LE文本,并将其编辑为UTF-8(或ASCII或cp1252),并尝试添加一对空格,那么您实际上是在添加一个U + 2020。通常情况下,您认为将UTF-16和UTF-8混合起来很困难。但很明显,你只是在观察文本,而不是实际查看字节,如果你的所有数据都符合Latin-1,那么UTF-16对于你的眼球来说看起来非常好 - 当然,每个真实之后都有一个看不见的NUL字符。性格,但你看不到隐形的东西。

无论如何,具体细节是什么并不重要。解决这个问题的唯一方法是查看链上每个步骤生成的文件中的实际字节数,找出错误的位置并进行相应的修复。如果你不知道如何做到这一点,你需要给别人足够的信息来为你做。

但是,如果您只是想要快速解决方法:将您正在提供的文件放入Python脚本中,并在十六进制编辑器中查看它。找到两个垃圾字符,并记录它们的字节数。如果他们是,只需更改代码即可ac 86

答案 1 :(得分:0)

您的数据没有任何问题 - 它是纯ASCII。问题出在您的源代码中。

单击“编辑”按钮复制实际的源,而不是格式化的源,它在template字符串文字的中间有不间断的空格(U + 00A0)字符。

假设您的编辑器和您复制并粘贴的浏览器正常运行,这意味着您的实际UTF-8源具有'\xc2\xa0'个序列。

由于您将非ASCII字符放入str / bytes字面(正如我在其他答案中所解释的那样,总是一个坏主意) ,这意味着你的字符串以'\xc2\xa0'序列结束。

在屏幕之间的某处,有一个额外的编码问题,这会导致'\xc2\xac\xe2\x80\xa0'序列混乱 - 当被解释为UTF-8时,显示为u'¬†'

我们可以尝试追踪其他问题的来源,但这并不重要。

立即解决方法是使用纯ASCII空格替换源中的所有非中断空格。

除此之外,你需要弄清楚你正在使用什么产生这些不间断的空间。通常,这是在文字处理器而不是文本编辑器中编辑源代码的标志;如果是这样,请停止这样做。

如果您实际上没有任何故意非ASCII源代码,则在文件顶部使用# coding=ascii而不是# coding=utf-8是捕获此类错误的好方法。 (您仍然可以处理UTF-8值;所有编码声明都说源代码本身是UTF-8。)

答案 2 :(得分:-1)

试试这个:

line = re.sub(r'(?u) ','', line.rstrip())

然后正则表达式将你的字符串视为unicode。