使用外部文件替换特殊字符?

时间:2012-02-08 06:16:23

标签: python sqlite config

我的问题可能令人困惑但是,请原谅我是SO的新手,我在sqlite表中有一组像下面这样的国家名称! !

Namesofcountries

“美国$”
“Brazil--”
“‘捷’‘’'”
;迪拜
^^英格兰''

在上面的列表中,我需要用空格替换所有特殊字符,我可以用这段代码完成!

  

cur.execute('选择替换(替换(替换(替换(@str,'!',''),'\',''),'/',''),'&',' ')')

现在没关系,它正在工作,但我需要在一个单独的配置文件或一个被调用然后被替换的普通外部文件中替换所有字符,如果我需要添加更多的话,它变得很容易将来要重新加入的字符。

你可以解释一下我的例子吗?

2 个答案:

答案 0 :(得分:2)

听起来你对Python来说比较新。欢迎。正如俗话所说,我自己就是这里的陌生人。

当Jim说你应该尝试这个代码而不是要求它为你编写时,Jim是正确的。那就是说,给你怀疑的好处,我将带你走过我自己,希望这将是一次学习经历

char_cfg = open('9188651a.txt', 'r')
special_chars = char_cfg.readline()
char_cfg.close()

这3行打开一个文本文件进行读取,将第一行读入名为special_chars的字符串,然后关闭cfg文件,因为我们不再需要它。我的9188651a.txt文件看起来像这样:

!\/&"-$;^

它只包含我们希望替换的字符,没有特别的顺序。

接下来的三行非常相似,打开第二个文件,其中包含我们需要替换的“脏”国家/地区名称:

ucountries = open('9188651b.txt', 'r')
list_countries = ucountries.readlines()
ucountries.close()

注意一个关键区别:我使用readlines()方法而不是readline()。此方法读取整个文件,并将每行作为字符串放在文件中。这是读取和存储多行文件内容的一种非常方便的方法。我的9188651b.txt文件包含以下测试数据:

"America$"
"Brazil--"
"Czech"""
;Dubai
^^England"

我用以下代码完成代码:

countries = open('9188651c.txt', 'w')

for country in list_countries:
    for bad_char in special_chars:
        country = country.replace(bad_char, '')
    countries.write(country)

countries.close()

第一行和最后一行是最容易理解的:我打开第三个文件9188651c.txt将我的输出写入(在open()方法调用中用'w'标志表示)。如果此文件尚不存在,Python将自动为我们创建它。我写完文件后关闭文件。这是所有编程语言的标准编码实践。

该计划的内容包括中间的四条线。

for country in list_countries:

说,“遍历我们之前创建的整个国家/地区列表,每次都执行一次这套命令。” Python允许您以非常自然的方式遍历数据结构中的所有项。这是人们有时将Python称为“可执行伪代码”的一个原因。

for bad_char in special_chars:

说,“遍历我们从char_cfg文件中读取的字符串,为字符串中的每个字符执行某些操作。”由于这个for循环在另一个for循环中,我们实际上将多次遍历for循环,对于外循环的每次迭代都会执行一次。

country = country.replace(bad_char, '')

简单地说,“将国家字符串中的所有出现的bad_char(这是list_countries字符串列表中的一项)替换为'',或者什么都不是。”我们将更改后的字符串保存在list_countries中的相同位置。

最后,

countries.write(country)

将修改后的字符串(country)写入输出文件的下一行。请注意此代码相对于我们的循环的缩进;我们希望每个国家执行一次,而不是每个坏角色执行一次,所以我们将它放在适当的缩进处,以便Python在外部循环中包含该命令,但不包括内部循环。

果然,我们的输出文件现在可以检查:

America
Brazil
Czech
Dubai
England

公平警告,你不太可能经常受到这种怀疑的好处。花时间回复的人希望您在发布问题之前花时间自己尝试一下。祝你好运,并确保随处可见 - 一旦你学会了如何正确使用它,Stack Overflow就是一个很棒的资源。

答案 1 :(得分:1)

我还不能发表评论,但我想补充说,未来的名单中可能会出现不同的不良字符。

也许保留优秀角色会更好吗?

import string
good_characters= string.ascii_letters # a-z, A-Z

然后上面的答案有

for bad_char in special_chars:
    country = country.replace(bad_char, '')

改为使用

country = ''.join(s if s in good_characters else ' ' for s in country).strip()

根本不容易理解,但这里有:

(s if s in good_characters else ' ' for s in country)

创建国家中所有角色的元组(即“for s in country”部分) 但是,如果它是一个字母,请使用该字母;如果不是,则使用该字母(即“如果s在good_character中”,那么“

''.join(...)将元组变回字符串

.strip()通过用空格替换坏字符来取消前面和后面的额外空格。

尽管我已经被教过你应该在使用正则表达式之前尝试使用字符串方法,但我认为我只是为了避免方法的理解和链接而接近这个...