Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python从另一个文件中删除不匹配的文件行_Python_String_Text_Match_String Matching - Fatal编程技术网

Python从另一个文件中删除不匹配的文件行

Python从另一个文件中删除不匹配的文件行,python,string,text,match,string-matching,Python,String,Text,Match,String Matching,我有两个文件,第一个有必要的数据,第二个有要保存的行列表: 我已尝试使用python代码进行过滤: import os.path # loading the input files output = open('descmat.txt', 'w+') input = open('descmat_all.txt', 'r') lists = open('training_lines.txt', 'r') print "Test1" # reading the input

我有两个文件,第一个有必要的数据,第二个有要保存的行列表:

我已尝试使用python代码进行过滤:

import os.path

# loading the input files
output    = open('descmat.txt', 'w+')
input     = open('descmat_all.txt', 'r')
lists      = open('training_lines.txt', 'r')
print "Test1"

# reading the input files
list_lines = lists.readlines()
list_input = input.readlines()

print "Test2"
output.write(list_input[0])

for i  in range(len(list_lines)):
    for ii in range(len(list_input)):
        position = list_input[ii].find(list_lines[i][:-1])
        if position > -1:
            output.write(list_input[ii])
        break 

print "Test3"
output.close()

但此脚本找不到任何匹配项。什么是只保留第一个文件中与第二个文件匹配的行的最简单解决方案?

对于此类问题,Python有数据类型

# prepare a set of normalised training lines
# stripping new lines avoids possible problems with the last line

OK_lines = set(line.rstrip('\n') for line in open('training_lines.txt'))

# when you leave a with block, all the resources are released
# i.e., no need for file.close()

with open('descmat_all.txt') as infile:
    with open('descmat.txt', 'w') as outfile:
        for line in infile:
            # OK_lines have been stripped, input lines must be stripped as well
            if line.rstrip('\n') in OK_lines:
                outfile.write(line)
简单的测试
对于这类问题,Python具有数据类型

# prepare a set of normalised training lines
# stripping new lines avoids possible problems with the last line

OK_lines = set(line.rstrip('\n') for line in open('training_lines.txt'))

# when you leave a with block, all the resources are released
# i.e., no need for file.close()

with open('descmat_all.txt') as infile:
    with open('descmat.txt', 'w') as outfile:
        for line in infile:
            # OK_lines have been stripped, input lines must be stripped as well
            if line.rstrip('\n') in OK_lines:
                outfile.write(line)
简单的测试
如果您将两个文件都读入一个列表,您可以简单地比较列表。看看怎么做
out
应包含可匹配字符串的列表

out = [e for e in list_input for i in list_lines if e.startswith(i)]
output.writelines(out)

如果您将两个文件都读入一个列表,您可以简单地比较列表。看看怎么做
out
应包含可匹配字符串的列表

out = [e for e in list_input for i in list_lines if e.startswith(i)]
output.writelines(out)

替换此部分代码:

for i  in range(len(list_lines)):
    for ii in range(len(list_input)):
        position = list_input[ii].find(list_lines[i][:-1])
        if position > -1:
            output.write(list_input[ii])
        break 
据此:

for i  in range(len(list_lines)):
    for ii in range(len(list_input)):
        if list_input[ii][:26] == list_lines[i][:-1]:
            output.write(list_input[ii])

完全符合我的需要。

替换这部分代码:

for i  in range(len(list_lines)):
    for ii in range(len(list_input)):
        position = list_input[ii].find(list_lines[i][:-1])
        if position > -1:
            output.write(list_input[ii])
        break 
据此:

for i  in range(len(list_lines)):
    for ii in range(len(list_input)):
        if list_input[ii][:26] == list_lines[i][:-1]:
            output.write(list_input[ii])


这正是我所需要的。

作为输出,只有空文件它对我有效,请参阅我在帖子中添加的测试用例。感谢您的解释,但是有我的输入文件:并且-运行此代码会生成一个emty文件…如果a的行正好是B中包含的行,则我的代码会将a的行复制到C。也许我误解了您想要的内容,也许您的输入文件中没有任何行与您的培训文件中的任何行完全匹配。--如果这是我的误解,你可以把你的问题说得更清楚,我可以试着给出另一个答案。由于输出只有空文件,它对我有效,请参阅我在帖子中添加的测试用例。谢谢你的解释,但是有我的输入文件:并且-运行此代码会生成一个emty文件…如果a的行正好是B中包含的行,则我的代码会将a的行复制到C。也许我误解了您想要的内容,也许您的输入文件中没有任何行与您的培训文件中的任何行完全匹配。--如果这是我的误解,你可以把你的问题说得更清楚,我可以试着给出另一个答案。据我所知,您必须匹配每个字符串的开始顺序。我对代码做了一些修改。检查它是否有效。谢谢!我找到了有效的解决办法;我仍然不明白为什么这个代码不起作用…对不起,我编辑的代码几秒钟前才出现。然而,我用文件的前两行检查了我的新代码,它工作了。你有Python 2.8吗?还是不为我工作。。。非常奇怪,所以我将继续使用简单的“if”解决方案。有趣的是,我正在使用Python3.5,但其功能是基本的Python。
out
列表是否已为空或仅输出文件?事实上,这段代码的作用与if解决方案完全相同。列表比较中的嵌套循环。好的,我以前没有检查过你的文件。据我所知,您必须匹配每个字符串的开始顺序。我对代码做了一些修改。检查它是否有效。谢谢!我找到了有效的解决办法;我仍然不明白为什么这个代码不起作用…对不起,我编辑的代码几秒钟前才出现。然而,我用文件的前两行检查了我的新代码,它工作了。你有Python 2.8吗?还是不为我工作。。。非常奇怪,所以我将继续使用简单的“if”解决方案。有趣的是,我正在使用Python3.5,但其功能是基本的Python。
out
列表是否已为空或仅输出文件?事实上,这段代码的作用与if解决方案完全相同。列表比较中的嵌套循环。