我有一个.txt:
#Date 111111:UhUidsiIds
#Name Sebastian-Forset
#Date 222222:UdfasdUDsa
#Name Sebastian_Forset2
#Date 333333:UDsafduD
#Name Solaris Mage
#Date 444444:Ghdsasra
#Name Marge S
和一个文件:
#Name Sebastian Forset
#Date 191020
#Name Sebastian Forset2
#Date 201020
#Date Homer S
#Date 281902
名称相同,但有一些字符差异(空格, - ,_等) 我会将第二个文件的编号复制到第一个文件,以便得到最终文件txt:
#Name Sebastian Forset
#Date 191020:UhUidsiIds
#Name Sebastian Forset2
#Date 201020:UdfasdUDsa
#Name Solaris Mage
#Date 281902:UDsafduD
#Name Marge S
#Date 444444:Ghdsasra
这是我的代码,但合并文件,只复制同名
def isInFile(l, f):
with open(f, 'r') as f2:
for line in f2:
if l == line:
return True
return False
def similitudes(file1, file2):
same = 0
data = ''
copy = False
with open(file1, 'r') as f1:
for line in f1:
if copy == True:
data += line
if line == '\n' or line[0:6] != '#Name ':
copy = False
if (line[0:6] == '#Name ') or line[0:6] == '#Date ':
print line
if isInFile(line, file2) == True:
copy = True
data += line
print "true"
else:
print "ok"
same += 1
return data
def main(argv=2):
print (sys.argv[1])
print (sys.argv[2])
if argv == 2:
out = open('final.txt', 'w')
data = (
similitudes(sys.argv[1], sys.argv[2]) + '\n'
)
out.write(data)
out.close()
else:
print ("This program need 2 files")
exit (0)
return 0
if __name__ == '__main__':
status = main()
sys.exit(status)
答案 0 :(得分:1)
首先,列出不同的字符。我们说"-" , "_" and " ".
现在使用这些分隔符拆分两个字符串。你可以在python中使用“re”包。
>>> a='Mr-Sebastian_Forset '
>>> import re
>>> re.split('- |_ | ',a)
['Mr', 'Sebastian', 'Forset']
如果两个字符串的结果列表相等,请将数字粘贴到第一个文件的第二个文件中。
您可以使用相同的分隔符概念来分割数字并将其粘贴到其他文件中。
答案 1 :(得分:0)
使用maketrans
/ translate
清除名称,将第一个文件读入字典。
使用zip(file, file)
一次读取文件的2行可以更容易处理
并使用.split(' ', 1)[1]
删除第一列
并.strip()
摆脱任何周围的空白(即\n
)
然后你可以阅读更新字典的第二个文件。
在Python3中,这看起来像:
>>> punc = str.maketrans('_-', ' ') # import string & string.maketrans() in Py2
>>> with open(filename1) as file1, open(filename2) as file2:
... data = {name.split(' ', 1)[1].strip().translate(punc):
... date.split(' ', 1)[1].strip().split(':')
... for name, date in zip(file1, file1)}
... for n, d in zip(file2, file2):
... data[n.split(' ', 1)[1].strip()][0] = d.split(' ', 1)[1].strip()
>>> data
{'Marge S': ['444444', 'Ghdsasra'],
'Sebastian Forset': ['191020', 'UhUidsiIds'],
'Sebastian Forset2': ['201020', 'UdfasdUDsa'],
'Solaris Mage': ['281902', 'UDsafduD']}
之后,只需将字典写入新文件即可。
>>> with open(<output>, 'w+') as output:
... for name, date in data.items():
... output.write('#Name {}\n'.format(name))
... output.write('#Date {}:{}\n'.format(*date))
注意:我必须改变荷马S&#39;到了&#;; Solaris Mage&#39;在第二个文件中获取所述输出。
答案 2 :(得分:0)
<强> Adding another answer, which will points out the bug in your code
强>
来到下面的代码
if (line[0:6] == '#Name ') or line[0:6] == '#Date ':
print line
if isInFile(line, file2) == True:
copy = True
data += line
在这里,您正在检查您的行是以"#Name "
还是"#Date "
开头,并使用行和 file2 调用isInFile()方法作为论点。
这是第一个问题,在您的情况下,不会只发送一行以"#Name "
开头的行。
如果当前行以"#Date "
开头,则将前一行和文件作为参数发送到此方法。
第二个问题是isInFile()定义,它实际上没有做任何事情。
if l == line:
return true
您只是检查file1和file2中的两行是否相同,如果是,则在sysout中写入此行。 因此,您的程序只会打印file1和file2之间的公共行。
修改后的代码应该如下所示:
def isInFile(l, f):
line_found = false
required_line = null
with open(f, 'r') as f2:
for line in f2:
if line_found:
required_line = line
break
elif l == line:
line_found = true
return (line_found, required_line)
def similitudes(file1, file2):
same = 0
data = ''
copy = False
previous_line = null
with open(file1, 'r') as f1:
for line in f1:
if copy == True:
data += line
if line == '\n' or line[0:6] != '#Name ':
copy = False
if (line[0:6] == '#Name '):
print line
previous_line = line
elif line[0:6] == '#Date ':
print line
file2_line_info = isInFile(previous_line, file2)
if file2_line_info[0] == True:
copy = True
data += file2_line_info[1]
print "true"
return data
def main(argv=2):
print (sys.argv[1])
print (sys.argv[2])
if argv == 2:
out = open('final.txt', 'w')
data = (
similitudes(sys.argv[1], sys.argv[2]) + '\n'
)
out.write(data)
out.close()
else:
print ("This program need 2 files")
exit (0)
return 0
if __name__ == '__main__':
status = main()
sys.exit(status)
注意:这不是pythonic的做事方式。正如我在上面的回答https://stackoverflow.com/a/34696778/3534696中提到的,使用&#34; re&#34;模块并有效地解决问题。