在Python中如何使文件中的每一行成为一个元组并使它们在列表中?

In Python how to make each line in a file to be a tuple and make them in a list?

我们有一个功课,我有一个严重的问题。
关键是使每一行成为一个元组,并将这些元组设置为一个列表。
喜欢list=[tuple(line1),tuple(line2),tuple(line3),...]
此外,有许多字符串用逗号分隔,如"aei","1433","lincoln",...

这是一个问题:

一本书可以表示为作者的姓氏,作者的firstName,标题,日期和ISBN的元组。

  • 编写一个函数readBook(),给定一个包含此信息的逗号分隔字符串,返回表示该书的元组。

  • 编写一个函数readBooks(),给定每个书中包含一个逗号分隔行的文本文件的名称,使用readBook()返回元组列表,每个元组描述一本书。

  • 编写一个函数buildIndex(),在给定readBooks()返回的书籍列表的情况下,构建从关键词到书名的地图。关键词是书中标题中的任何单词,除了"a","an"或"the"。

这是我的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
RC=("Chann","Robbbin","Pride and Prejudice","2013","19960418")
RB=("Benjamin","Franklin","The Death of a Robin Thickle","1725","4637284")
def readBook(lastName, firstName, booktitle, date, isbn):
    booktuple=(lastName, firstName, booktitle, date, isbn)
    return booktuple
# print readBook("Chen","Robert","Pride and Prejudice","2013","19960418")

def readBooks(file1):
    inputFile = open(file1,"r")
    lines = inputFile.readlines()
    book = (lines)
    inputFile.close()
    return book
print readBooks("book.txt")
BooklistR=[RC,RB]

def buildIndex(file2):
    inputFile= open("book.txt","r")
    Blist = inputFile.readlines()
    dictbooks={}
    for bookinfo in Blist:
        title=bookinfo[2].split()
        for infos in title:
            if infos.upper()=="A":
                title.remove(infos)
            elif infos.upper()=="THE":
                title.remove(infos)
            elif infos.upper()=="AN":
                title.remove(infos)
            else:
                pass
        dictbooks[tuple(title)]= bookinfo[2]
    return dictbooks
print buildIndex("book.txt")

#Queries#
def lookupKeyword(keywords):
    dictbooks=buildIndex(BooklistR)
    keys=dictbooks.viewkeys()
    values=dictbooks.viewvalues()
    for keybook in list(keys):
        for keyw in keywords:
            for keyk in keybook:
                if keyw== keyk:
                    printoo= dictbooks[keybook]
                else:
                    pass
    return printoo
print lookupKeyword("Robin")


这样的事情有什么问题?:

1
2
with open(someFile) as inputFile:
    myListofTuples = [tuple(line.split(',')) for line in inputFile.readlines()]

[解释根据罗伯特的评论添加]

第一行在with语句中打开文件。 Python with语句是一个相当新的功能,相当先进。设置一个上下文,其中代码执行时有一定的保证,即当Python引擎退出该上下文时(无论是通过完成工作还是遇到未处理的异常),将如何执行清理和完成代码。

您可以在以下网址上阅读有关丑陋细节的内容:Python Docs:Context Managers,但它的全部要点是我们打开someFile,并保证在代码执行完毕后它将被正确关闭(该套件) with语句之后的语句。即使我们遇到一些错误,或者我们在该套件中的代码引发了一些我们无法捕获的异常,也会这样做。

在这种情况下,我们使用as子句为我们提供一个本地名称,通过该名称我们可以引用打开的文件对象。 (文件名只是一个字符串,作为参数传递给open()内置函数...该函数返回的对象需要有一个名称,我们可以通过它来引用它。这类似于谁a < x5>语句通过循环将每个项目绑定到名称i的每个项目。

我们的with语句的套件(即在上下文管理器的上下文中运行的缩进语句集)由单个语句组成......列表解析绑定到名称myListofTuples

列表理解是另一个相当高级的编程概念。有许多非常高级的语言以各种方式实现它们。在Python的情况下,它们可以追溯到比with语句更早的版本---我认为它们是在2.2左右的时间框架中引入的。

因此,列表推导在Python代码中相当普遍,而with语句只是慢慢被采用。

Python中的列表文字看起来像:[something, another_thing, etc, ...]列表推导类似,但用表达式替换项目文字列表,这是一行代码,用于计算列表。例如:[x*x for x in range(100) if x % 2]是一个列表推导,它计算成一个整数列表,它是1到99之间奇数整数的平方。(注意列表解析中没有逗号。表达式代替逗号分隔的序列这将在列表文字中使用)。

在我的例子中,我使用for line in inputFile.readlines()作为表达式的核心,我将其中的每一个拆分为公共(line.split(',')),然后将结果列表转换为tuple()

这只是一种非常简洁的说法:

1
2
3
myListofTuples = list()
for line in inputfile.readlines():
    myListofTuples.append(line.split(','))


一个可能的计划:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import fileinput

def readBook(str):
    l = str.split(',')
    t = (l[0:5])
    return t

#b = readBook("First,Last,Title,2013,ISBN")
#print b

def readBooks(file):
    l = []
    for line in fileinput.input(file):
        t = readBook(line)
        # print t
        l.append(t)
    return l

books = readBooks("data")

#for t in books:
#    for f in t:
#        print f

def buildIndex(books):
    i = {}
    for b in books:
        for w in b[2].split():
            if w.lower() not in ('a', 'an', 'the'):
                if w not in i:
                    i[w] = []
                i[w].append(b[2])
    return i

index = buildIndex(books)

for w in sorted(index):
    print"Word:", w
    for t in index[w]:
        print"Title:", t

示例数据文件(代码中称为"数据"):

1
2
3
Austen,Jane,Pride and Prejudice,1811,123456789012X
Austen,Jane,Sense and Sensibility,1813,21234567892
Rice-Burroughs,Edgar,Tarzan and the Apes,1911,302912341234X

样本输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Word:  Apes
Title:  Tarzan and the Apes
Word:  Prejudice
Title:  Pride and Prejudice
Word:  Pride
Title:  Pride and Prejudice
Word:  Sense
Title:  Sense and Sensibility
Word:  Sensibility
Title:  Sense and Sensibility
Word:  Tarzan
Title:  Tarzan and the Apes
Word:  and
Title:  Pride and Prejudice
Title:  Sense and Sensibility
Title:  Tarzan and the Apes

请注意,由于嵌入了逗号,数据格式无法支持书籍标题,如"狮子,女巫和魔衣橱"。如果文件是CSV格式,并且字符串周围有引号,那么它可以管理它。

我不确定这是完全最低限度的Pythonic代码(完全不确定),但它确实符合要求。