用Python从命令行读取文件并处理大文件中的"\n\r"换行符

4

我第一次学习Python,刚刚了解到readlines()的速度非常慢,并且占用内存很高。这本来没关系,但由于我正在为一个数据结构课程编程,有多达10^6的输入量,我认为运行时间非常重要。

这是我目前的工作进展,它可以工作。我还没有去掉'\r'。

def generateListOfPoints(stuff):
    List = open(stuff).readlines()

    a = []

    for i in range(len(List)):
        a.append(List[i].rstrip('\n').split(","))

    return a

这是我尝试使用for循环(听说它更好)所做的事情,但是我只得到了错误,而我不知道发生了什么。
def generateListOfPoints(stuff):

    a = []
    with open(stuff) as f:
        for line in f:
            a.append(stuff.rstrip('\n').rstrip('\r').split(","))
    return a

你需要的是 a.append(line.rstrip('\n').lstrip('\r').split(",") - Ashwini Chaudhary
3个回答

4

stuff替换为linestuff是文件路径,实际内容在line中--变量用于遍历生成器f

a.append(line.rstrip('\n').split(","))

你可能希望将在line上使用split后形成的列表存储为元组,这样a就会成为一个元组的列表,其中每个元组对应文件中的一个line。你可以使用以下方式实现:

a.append(tuple(line.rstrip('\n').split(",")))

这是错误的,因为Python会在\n上拆分行,导致\r会出现在下一行的开头(除非他们使用旧版Mac OS,该系统将把\r视为具有通用换行符支持的换行符)。 - Ashwini Chaudhary
复制 @krock 的答案并不能帮助你,因为他们的解决方案也是不正确的。 - Ashwini Chaudhary
不,这也是不正确的。现在你只是使用了OP的第一段代码。 - Ashwini Chaudhary
我在我的Ubuntu上的Python中没有看到'\r'结束出现在下一行的开头,所以我不知道需要修复什么。 - Saksham Varma
我不确定你是如何测试它的,请尝试像这样做:https://gist.github.com/ashwch/8090cff47f69ff0a3ad4 - Ashwini Chaudhary

1
确保给你的变量命名,使它们有意义。将某些东西命名为stuff是方便的,但显然会导致错误。下面的示例将其重命名为filename,并修复了将line添加到列表而不是文件名的错误。
此外,rstrip函数需要一组要剥离的字符,因此您可以在一个函数调用中剥离\r\n。所以你会有:
def generateListOfPoints(filename):
    a = []
    with open(filename) as f:
        for line in f:
            a.append(line.rstrip('\r\n').split(","))
    return a

这将创建一个嵌套列表。如果你想要在解决方案中展开内部列表,你需要使用extend 而不是 append

https://dev59.com/cInda4cB1Zd3GeqPE9xI#RW4RoYgBc1ULPQZF6FRW - Ashwini Chaudhary

1
我建议您尝试使用命令行解释器。这样可以很容易地学习rstring和split的工作原理。假设您按照建议开始使用line变量,您可能没有将想要的内容附加到a列表中。此外,您可以通过一次调用rstrip来同时去除\n和\r。
python
>>> a = []
>>> line = "this,is,a,test\n\r"
>>> line.rstrip('\n\r')
'this,is,a,test'
>>> line.rstrip('\n\r').split(',')
['this', 'is', 'a', 'test']
>>> a.append(line.rstrip('\n\r').split(','))
>>> a
[['this', 'is', 'a', 'test']]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接