Python字符串比较和替换

时间:2016-01-09 17:20:38

标签: python compare

我有一个.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)

3 个答案:

答案 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;模块并有效地解决问题。