我是编程和python的新手,我正在寻找一种方法来区分同一输入文件文本文件中的两种输入格式。例如,假设我有一个像这样的输入文件,其中值以逗号分隔:
5
华盛顿,A,10
纽约,B,20
西雅图,C,30
波士顿,B,20
D,50,亚特兰大
2
纽约,5
波士顿,10
其中格式为 N ,后跟Data1的 N 行,然后 M ,后跟 M 行数据2。我尝试打开文件,逐行读取并将其存储在一个列表中,但是我不确定如何为Data1和Data2生成2个列表,这样我会得到:
Data1 = [“华盛顿,A,10”,“纽约,B,20”,“西雅图,C,30”,“波士顿,B,20”,“亚特兰大,D,50”]
Data2 = [“纽约,5”,“波士顿,10”]
最初的想法是遍历列表,直到找到整数 i ,从列表中删除该整数,然后继续进行下一个 i 迭代,同时存储后续值在单独的列表中,直到我找到下一个整数然后重复。但是,这会破坏我的初始列表。是否有更好的方法将两种列表中的两种数据格式分开?
答案 0 :(得分:0)
您肯定在正确的轨道上。 如果要在此处保留原始列表,则实际上不必删除整数 i ;您可以继续进行下一项。
代码:
originalData = []
formattedData = []
with open("data.txt", "r") as f :
f = list(f)
originalData = f
i = 0
while i < len(f): # Iterate through every line
try:
n = int(f[i]) # See if line can be cast to an integer
originalData[i] = n # Change string to int in original
formattedData.append([])
for j in range(n):
i += 1
item = f[i].replace('\n', '')
originalData[i] = item # Remove newline char in original
formattedData[-1].append(item)
except ValueError:
print("File has incorrect format")
i += 1
print(originalData)
print(formattedData)
答案 1 :(得分:0)
以下代码将产生一个列表results
,该列表等于[Data1, Data2]
。
代码假定指定的条目数恰好是所存在的数量。这意味着对于这样的文件,它将无法正常工作。
2
纽约,5
波士顿,10
西雅图,30
代码:
# get the data from the text file
with open('filename.txt', 'r') as file:
lines = file.read().splitlines()
results = []
index = 0
while index < len(lines):
# Find the start and end values.
start = index + 1
end = start + int(lines[index])
# Everything from the start up to and excluding the end index gets added
results.append(lines[start:end])
# Update the index
index = end
答案 2 :(得分:0)
您可以使用itertools.islice
和列表理解:
from itertools import islice
string = """
5
Washington,A,10
New York,B,20
Seattle,C,30
Boston,B,20
Atlanta,D,50
2
New York,5
Boston,10
"""
result = [[x for x in islice(parts, idx + 1, idx + 1 + int(line))]
for parts in [string.split("\n")]
for idx, line in enumerate(parts)
if line.isdigit()]
print(result)
这产生
[['Washington,A,10', 'New York,B,20', 'Seattle,C,30', 'Boston,B,20', 'Atlanta,D,50'], ['New York,5', 'Boston,10']]
对于文件,您需要将其更改为:
with open("testfile.txt", "r") as f:
result = [[x for x in islice(parts, idx + 1, idx + 1 + int(line))]
for parts in [f.read().split("\n")]
for idx, line in enumerate(parts)
if line.isdigit()]
print(result)