在 python 3.0 中同时读取两个文本文件并提取所需的字符串
Reading two text file simultaneously in python 3.0 and extracting required string
我有两个文本文件,其数据类似于
file_1:
data1 data_1 1
data2 data_2 2
data3 data_2 2
data2 data_4 1
data3 data_3 1 and so on....
等等
file_2:
data1
data2
data1
data3
data2
我想得到一个输出
data1:
> data1 data_1 1
> data1 data_3 2
data2:
> data2 data_2 2
> data2 data_4 1
data3:
> data3 data_3 1
等等...
我从目前的代码中得到了什么:
data1:
> data1 data_1 1
data2:
> data2 data_2 2
data3:
> data3 data_2 2
> data2 data_4 1
> data3 data_3 1
代码:
first_occurance = {}
with open("folder_1/file_1", "r") as file_1:
with open("folder_1/file_2", "r") as file_2:
for line_1,line_2 in zip(file_1, file_2):
only_command = line_1.split()[0]
if only_command in line_2:
if only_command not in first_occurance:
print ("\n " + only_command + " :\n")
print (" > " + line_1.strip())
else:
print (" > " + line_1.strip())
first_occurance[only_command] = only_command
但这并不像预期的那样工作,因为数据没有根据标题格式化,例如对应于 data2
的行也显示在 data3
中。任何针对此问题的指导都会非常有帮助....
以下是我认为您可能会尝试做的事情:
from collections import defaultdict
data = """data1 data_1 1
data2 data_2 2
data1 data_3 2
data3 data_4 1
data2 data_3 1"""
commands = """data1
data2
data1
data3
data2"""
store = defaultdict(list)
for line, cmd in zip(data.split('\n'), commands.split('\n')):
if line.startswith(cmd):
store[cmd].append(line.strip())
for command in sorted(store):
print("\n{}:".format(command))
for l in store[command]:
print(" >", l)
这会产生以下输出:
data1:
> data1 data_1 1
> data1 data_3 2
data2:
> data2 data_2 2
> data2 data_3 1
data3:
> data3 data_4 1
对于命令中的每一行(您从 file_2
中读取的内容),如果数据 (file_1
) 中完全相同的行以相同的 "command" 开头,则会将其存储。顺便说一句,您正在大量更改数据,我不确定我们是否理解您在那里想要什么。看来,file_2 甚至没有用,或者您可能想重新对齐数据?
无论如何,在存储分组数据后,您可以按排序顺序打印组(data1、2、3 ...)。您必须存储所有组,否则您将不得不为每个(数据)组一次又一次地读取文件。如果你不这样做,你会得到你当前的输出——因为你在收到数据时就打印了它。
但是,似乎根本不需要您的 file_2
数据,至少根据您在问题中想要的输出是这样。所以这里是产生你想要的输出的文件读取版本;请注意,它不需要读取 file_2
:
from collections import defaultdict
store = defaultdict(list)
with open("folder_1/file_1", "r") as data:
for line in data:
cmd, content = line.split(' ', 1)
store[cmd].append(line.strip())
for cmd in sorted(store):
print("\n{}:".format(cmd))
for line in store[cmd]:
print(" >", line)
我有两个文本文件,其数据类似于
file_1:
data1 data_1 1
data2 data_2 2
data3 data_2 2
data2 data_4 1
data3 data_3 1 and so on....
等等
file_2:
data1
data2
data1
data3
data2
我想得到一个输出
data1:
> data1 data_1 1
> data1 data_3 2
data2:
> data2 data_2 2
> data2 data_4 1
data3:
> data3 data_3 1
等等...
我从目前的代码中得到了什么:
data1:
> data1 data_1 1
data2:
> data2 data_2 2
data3:
> data3 data_2 2
> data2 data_4 1
> data3 data_3 1
代码:
first_occurance = {}
with open("folder_1/file_1", "r") as file_1:
with open("folder_1/file_2", "r") as file_2:
for line_1,line_2 in zip(file_1, file_2):
only_command = line_1.split()[0]
if only_command in line_2:
if only_command not in first_occurance:
print ("\n " + only_command + " :\n")
print (" > " + line_1.strip())
else:
print (" > " + line_1.strip())
first_occurance[only_command] = only_command
但这并不像预期的那样工作,因为数据没有根据标题格式化,例如对应于 data2
的行也显示在 data3
中。任何针对此问题的指导都会非常有帮助....
以下是我认为您可能会尝试做的事情:
from collections import defaultdict
data = """data1 data_1 1
data2 data_2 2
data1 data_3 2
data3 data_4 1
data2 data_3 1"""
commands = """data1
data2
data1
data3
data2"""
store = defaultdict(list)
for line, cmd in zip(data.split('\n'), commands.split('\n')):
if line.startswith(cmd):
store[cmd].append(line.strip())
for command in sorted(store):
print("\n{}:".format(command))
for l in store[command]:
print(" >", l)
这会产生以下输出:
data1:
> data1 data_1 1
> data1 data_3 2
data2:
> data2 data_2 2
> data2 data_3 1
data3:
> data3 data_4 1
对于命令中的每一行(您从 file_2
中读取的内容),如果数据 (file_1
) 中完全相同的行以相同的 "command" 开头,则会将其存储。顺便说一句,您正在大量更改数据,我不确定我们是否理解您在那里想要什么。看来,file_2 甚至没有用,或者您可能想重新对齐数据?
无论如何,在存储分组数据后,您可以按排序顺序打印组(data1、2、3 ...)。您必须存储所有组,否则您将不得不为每个(数据)组一次又一次地读取文件。如果你不这样做,你会得到你当前的输出——因为你在收到数据时就打印了它。
但是,似乎根本不需要您的 file_2
数据,至少根据您在问题中想要的输出是这样。所以这里是产生你想要的输出的文件读取版本;请注意,它不需要读取 file_2
:
from collections import defaultdict
store = defaultdict(list)
with open("folder_1/file_1", "r") as data:
for line in data:
cmd, content = line.split(' ', 1)
store[cmd].append(line.strip())
for cmd in sorted(store):
print("\n{}:".format(cmd))
for line in store[cmd]:
print(" >", line)