Python 3.x 打开python文件并附加特定信息
我有一个txt文件中的一些数据,我正试图将其排序到如下列表中:Python 3.x 打开python文件并附加特定信息,python-3.x,Python 3.x,我有一个txt文件中的一些数据,我正试图将其排序到如下列表中: [ALASKA, [2006/10/19, 2.8], [2006/10/18, 2.6], etc etc] [MEXICO, [2006/10/20, 2.8], [2006/10/18, 3.3]] for each location without any tuples or '' 2.8 2006/10/19 02:02:10 62.391 -149.751 15.0 CENTRAL ALASKA 2.5 20
[ALASKA, [2006/10/19, 2.8], [2006/10/18, 2.6], etc etc]
[MEXICO, [2006/10/20, 2.8], [2006/10/18, 3.3]] for each location without any tuples or ''
2.8 2006/10/19 02:02:10 62.391 -149.751 15.0 CENTRAL ALASKA
2.5 2006/10/19 00:31:15 20.119 -156.213 1.5 MAUI REGION, HAWAII
5.0 2006/10/18 21:15:51 4.823 -82.592 37.3 SOUTH OF PANAMA
2.6 2006/10/18 21:12:25 59.934 -147.904 30.0 GULF OF ALASKA
3.4 2006/10/18 20:59:21 36.540 -89.640 7.7 SOUTHEASTERN MISSOURI
代码:
现在我遇到了一个错误,line.split函数无法解包每行上的所有8条数据,是否有其他方法可以删除3:5项?我知道它可能是列表中的pop函数。
str.split
包含一个可选的maxslit
参数,该参数限制要拆分的值,您可以使用该参数将整个位置名称作为单个项来获取。现在,您可以使用dict
来收集每个位置的数据列表<代码>集合。defaultdict在这里很好,因为它会自动为新键创建值。现在,您有了一个日期/大小对列表,您可以在编写时使用itertools.chain
对它们进行解压缩。把它们放在一起,你就会得到
import collections
import itertools
def main():
locations = collections.defaultdict(list)
with open('data.txt','r') as file:
for line in file:
magnitude, date, time, x, y, z, location = line.strip().split(' ', 6)
locations[location].append((date, magnitude))
with open('output.txt', 'w') as outfile:
for location, data in locations.items():
outfile.write('{}, {}\n'.format(location,
' ,'.join(itertools.chain.from_iterable(data))))
main()
print(open('output.txt').read())
此解决方案使用字典为每个区域设置保留每个事件的列表: 这是由于我没有文件而使用的示例数据:
data = [x.strip() for x in """
2.8 2006/10/19 02:02:10 62.391 -149.751 15.0 CENTRAL ALASKA
2.5 2006/10/19 00:31:15 20.119 -156.213 1.5 MAUI REGION, HAWAII
5.0 2006/10/18 21:15:51 4.823 -82.592 37.3 SOUTH OF PANAMA
2.6 2006/10/18 21:12:25 59.934 -147.904 30.0 GULF OF ALASKA
3.4 2006/10/18 20:59:21 36.540 -89.640 7.7 SOUTHEASTERN MISSOURI
""".split('\n')[1:-1]]
这段代码显示了如何遍历数据并将其拆分,同时维护整个位置。在发现整个位置后,很容易得到位置中的最后一个单词,并为该位置后缀保留每个事件的列表。并不是说传递给split()
的6
强制它将前五个字段之后的所有内容保留在一个剩余字段(位置)中:
像这样的方法应该会奏效:
def process(filename):
d = {}
with open(filename, "r") as f:
for line in f:
line_contents = line.split()
if line_contents[-1] in d.keys(): # we already have an entry
d[line_contents[-1]].append([line_contents[1], line_contents[0]])
else:
d[line_contents[-1]] = [[line_contents[1], line_contents[0]]]
return d
如果愿意,还可以将每个键的值设置为元组列表。请澄清代码中的问题-当前输出是什么?它应该是什么?目前,我预计会出现错误,因为当您尝试追加时,没有
category[1]
。你想改为使用字典{'ALASKA':[…],…}
吗?你的行.split(“”)
赋值会出错,因为在你显示的5个示例行中,有3行的末尾有2个以上的“location”单词。我也不明白你的数据的第一行应该是什么意思。我遇到了这样一个问题:我无法将每行的大小和日期保存为变量,因为我无法在不删除不必要的数据的情况下解包那么多变量(不知道如何在字符串中这样做)。理想情况下,我希望它看起来像**[阿拉斯加州,[2006/10/19,2.8],[2006/10/18,2.6]等等]***@skryt所以你只需要每行的前两个字段,用行中最后一个字段索引?@MattDMo从未想过这样看它,但是的,只是那些特定的片段。是否只有使用字典/元组才能处理字符串,我一直在尝试将其格式化为列表中的列表,但现在我在列表中添加项目时遇到了不必要的标点符号问题,例如()和“”的日期和日期magnitude@skryt我不太清楚你在问什么。我的代码创建了一个带有字符串键和列表值的字典,每个内部列表包含两个字符串。因此,如果你有三个阿拉斯加的条目,dict看起来像{'Alaska':['2.6','2006/10/19'],['3.7','2006/11/21'],['2.4','2006/12/13']}
是只可能创建一个字典,还是可以在列表中创建整个内容?[阿拉斯加,[2.62006/10/19],[3.72006/11/21],[2.42006/12/13]@skryt可以创建一个列表列表,其中每个内部列表的位置作为第一个元素,后续元素是震级/日期对。问题是之后访问数据。您如何找到“墨西哥”值或“夏威夷”值一个?您首先需要搜索列表列表中的每个子列表以找到正确的子列表,获取其索引,然后使用该索引访问其他数据。使用dict,您可以使用d[“LOCATION”]访问所有数据
,并使用进一步的切片来获取单个数据对。@skryt要添加到我上面所说的内容中,随着结果列表越来越大,所有的搜索将变得越来越昂贵,而使用dict则不会。
data_dict = {}
for line in data:
magnitude, date, time, x, y, z, location = line.split(' ', 6)
# get the last word in the location
location_suffix = location.split(' ')[-1]
# store the event
if location_suffix not in data_dict:
data_dict[location_suffix] = []
data_dict[location_suffix].append((date, magnitude))
def process(filename):
d = {}
with open(filename, "r") as f:
for line in f:
line_contents = line.split()
if line_contents[-1] in d.keys(): # we already have an entry
d[line_contents[-1]].append([line_contents[1], line_contents[0]])
else:
d[line_contents[-1]] = [[line_contents[1], line_contents[0]]]
return d