我试图取代像与缩略语词典“核糖核酸”“RNA”字。 我试着写了下面,但它并不能取代的缩写。
import csv,re
outfile = open ("Dict.txt", "w")
with open('Dictionary.csv', mode='r') as infile:
reader = csv.reader(infile)
mydict = {rows[0]:rows[1] for rows in reader}
print >> outfile, mydict
out = open ("out.txt", "w")
ss = open ("trial.csv", "r").readlines()
s = str(ss)
def process(s):
da = ''.join( mydict.get( word, word ) for word in re.split( '(\W+)', s ) )
print >> out, da
process(s)
样本trial.csv文件将是
A,B,C,D
RNA,lung cancer,15,biotin
RNA,lung cancer,15,biotin
RNA,breast cancer,15,biotin
RNA,breast cancer,15,biotin
RNA,lung cancer,15,biotin
样品Dictionary.csv:
rna,ribonucleic acid
rnd,radical neck dissection
rni,recommended nutrient intake
rnp,ribonucleoprotein
通过“核糖核酸”取代了我的输出文件应具有“RNA”
我觉得这条线s = str(ss)
引起的问题-已创建刚刚成为一个字符串列表!
试试这个:
def process(ss):
for line in ss:
da = ''.join( mydict.get( word, word ) for word in re.split( '(\W+)', line ) )
print >> out, da
process(ss)
我试图取代“RNA”,但我的字典里“RNA”。 有没有一种方法,我可以忽略的情况。
当然。 只需拨打casefold
每个键的同时创建字典,并再次在查找值:
mydict = {rows[0].casefold(): rows[1] for rows in reader}
# ...
da = ''.join( mydict.get(word.casefold(), word) for word in re.split( '(\W+)', s ) )
如果你正在使用Python的旧版本不具有casefold
(IIRC,它在2.7和3.2加入,但它可能会晚于被...),使用lower
替代。 它不会永远做正确的事非英语字符(例如, 'ß'.casefold()
是'ss'
,而'ß'.lower()
是'ß'
),但似乎这对OK你的申请。 (如果不是的话,你必须要么编写更复杂的东西与unicodedata
,或找到一个第三方库)。
另外,我不希望它来代替“corna”(我知道有这么一个词是不存在的,但我想,以确保它不会发生)与“coribonucleic酸”。
好吧,你已经这样做,你的re.split
,其将在任何“非字”字符; 那么你查找每个最终的字separtely。 由于corna
不会在快译通,它不会被取代。 (但请注意re
的的‘字’字概念实际上可能不是你想要,就什么包括下划线和数字作为单词的一部分,所以rna2dna
不匹配,而像二进制数据块s1$_2(rNa/
力量。)
你还要在你的代码中的另一个严重的问题:
ss = open ("trial.csv", "r").readlines()
s = str(ss)
调用readlines
意味着ss
将是行的列表。 主叫str
该列表上意味着s
将是一个大的字符串[
,则每一行的再版(与它周围的报价,反斜杠内它等)由逗号分隔,然后]
。 你几乎肯定不希望出现这种情况。 只要使用read()
如果你想整个文件读入一个字符串原样。
而你似乎有一个问题,在您的数据,太:
rna,ibonucleic acid
如果您要更换rna
与ibonucleic acid
,等等,你将会有一些难以阅读的输出。 如果这真的是你的字典格式,字典的用户应该推断出一些逻辑,例如,第一个字母被从缩写复制,你必须编写逻辑。 例如:
def lookup(word):
try:
return word[0] + mydict[word.casefold()]
except KeyError:
return word
da = ''.join(lookup(word) for word in re.split('(\W+), s))
最后,这是一个坏主意在字符串文本中使用转义反斜线。 在这种情况下,你过关了,因为Python恰好没有了意义\W
,但是这并不总是为真。 解决这个问题的最好方法是使用原始字符串字面量,像r'(\W+)'
。