我已经阅读了一个文本文件,并将每一行转换为一个列表。
使用此脚本:
l = [s.strip().split() for s in open("cluster2.wcnf").readlines()]
我将如何进行:
提前致谢
答案 0 :(得分:1)
首先,您必须从列表理解中删除.readlines()
其次,l
是一个列表列表,只需执行第一行:l[0]
。然后第一行的第一个元素是l[0][0]
。
我相信不断增长的文件存在的问题无法用这种方法解决。如果动态是指文件名,而不是文件行为,那么您可以替换将要从用户输入定义的变量的硬编码文件名。
答案 1 :(得分:0)
打开带有名字的文件(例如使用字符串)和选择/分配列表中的项目之类的东西实际上是非常基本的Python概念。我认为你能做的最好的事情就是阅读一本关于Python的好书。我建议Dive Into Python。
答案 2 :(得分:0)
1号: 当你说你希望它打开的文件是动态的时你的意思是你想让用户输入要打开的文件名吗?如果是这样,您只需将文件名存储到变量中即可。例如:
name = "myfile.txt"
并用名称替换“cluster2.wcnf”。
第4名:
您可以使用SilentGhost提到的索引来索引每行中的第一项(即l[0][0]
。要查看最后一项,您可以使用否定索引; l[0][-1]
将为您提供最后一项在第一个列表中。如果你想要一系列的项目,你可以使用类似l[0][2:6]
的东西,它会给你索引2,3,4和5的项目。这是范围内的项目[2,6 )。
答案 3 :(得分:0)
这是一种在整个文件中读取的更优化方式,其中每一行也被分成列表
import csv, sys
# 1 - User specifies file
file = input('File: ')
f = open(file, 'r')
reader = csv.reader(f, delimiter=' ')
lines = list(reader)
f.close()
# 2 - Select specific lines
print lines[4]
# 3 - Assign to list
lines[4] = obj # makes the whole line into that obj
lines[4][0] = obj # replaces the first item on the line with that obj
# 4 - Select first, last or a number of values
print lines[4][0] # first item in line 4
print lines[4][-1] # last item in line 4
print lines[4][1:4] # 2nd, 3rd and 4th items in line 4
答案 4 :(得分:0)
您询问问题的方式向我表明,您并不清楚您希望程序最终做什么。
首先,该行不仅将文件转换为列表。它将其转换为元组列表。每个元组都是文件中一行的一组空格分隔值。
我会回答你提出的问题,但我希望有些答案可能会让你更加困惑。
"cluster2.wcf"
不一定是字符串。它可以是一个变量。如果要按字面意思阅读您的问题,请按照以下方式修改代码:
filename = raw_input("Which file would you like to read: ")
l = [s.strip().split() for s in open(filename).readlines()]
这里需要注意的一点。将文件读入列表后,列表将如下所示:
[('This', 'is', 'the', 'first', 'line.'),
('This', 'is', 'the', 'second', 'line.'),
('And', 'finally', 'the', 'last', 'line.')]
列表中的每个元素都是该行上所有“字词”的进一步列表。单词被定义为空格分隔的字符组。
这个问题是一个令人困惑的问题。您已经阅读过该文件。你想再看一遍吗?我猜你实际上的意思是“在我将其读入列表后如何使用文件的特定行?”。我会回答这个问题。
文件的每一行都对应于列表的特定元素。列表元素由以0开头的数字访问。文件的第一行将在l[0]
中。 l[1]
中的第二个,依此类推(这里有一点Python魔法)l[-1]
。 Python中的负索引从列表末尾向后计数。
这个令人困惑,因为在将对象分配给其中的值后,您没有指定要分配的对象类型或要对列表执行的操作。这是一个非常简单地回答您问题的答案......
l[0] = object()
将对象分配给list元素,该元素曾用于包含表示文件第一行的元组。将此与之前的答案相结合,我打赌你可以弄清楚如何将一个对象分配给列表中的任何元素。
这取决于您想要如何选择它们。如果您想单独进行,请按以下方式进行:
first_word_of_first_line = l[0][0]
last_word_of_first_line = l[0][-1]
first_word_of_last_line = l[-1][0]
last_word_of_last_line = l[-1][-1]
first_five_words of_second_line = l[1][0:5] # The : is for specifying a range of values
last_five_words_of_first_line = l[0][-5:] # The : with no end means 'until the end'
不幸的是,获得前两行的前4个单词的方法不是这样的:
first_four_words_of_first_two_lines = l[0:2][0:4] # DOESN'T WORK!!!
原因是从列表中获取一系列值的结果是一个列表,因此[0:4]
适用于该列表。你真正想做的是应用[0:4]
来应用结果列表的每个元素来创建一个新列表。以下是您将如何做到这一点:
first_four_words_of_first_two_lines = [x[0:4] for x in l[0:2]]
这会给你一个看起来像这样的新列表(给出问题1的例子):
[('This', 'is', 'the', 'first'),
('This', 'is', 'the', 'second')]
我希望这很有帮助。正如我所说,我认为你的问题表明对事情有些困惑。但我不知道他们表示什么混淆,所以我只是尽力回答他们。