【问题标题】:Efficient string concatenation in Python 3 [duplicate]Python 3中的高效字符串连接[重复]
【发布时间】:2019-04-13 16:13:26
【问题描述】:

我正在编写一个 Python 3 代码,其任务是在一个目录中打开大约 550 个文件,读取它们的内容并将其附加到一个字符串变量 'all_text' 中,这将是大约数百万行长的一行。

我目前使用的低效代码如下-

all_text += str(file_content)

但后来我读到使用 'join()' 方法很有效,所以我尝试了以下代码-

all_text = ''.join(file_content)

此代码的问题在于,它删除了“all_text”变量先前保存的内容并仅写入当前文件的内容!

我该如何解决这个问题?

感谢您的帮助!

【问题讨论】:

    标签: python


    【解决方案1】:

    join() 有一个定义 str.join(iterable) 其中iterable 是生成器或列表或集合等。因此,如果您已经从文件中读取了一个字符串列表并且您正在使用 join 将它们连接起来,这将很有帮助。 例如

    numList = ['1', '2', '3', '4']
    seperator = ', '
    print(seperator.join(numList))
    
    numTuple = ('1', '2', '3', '4')
    print(seperator.join(numTuple))
    
    s1 = 'abc'
    s2 = '123'
    
    """ Each character of s2 is concatenated to the front of s1""" 
    print('s1.join(s2):', s1.join(s2))
    
    """ Each character of s1 is concatenated to the front of s2""" 
    print('s2.join(s1):', s2.join(s1))
    

    您可以使用 ''.join(readlines(f)) 之类的连接来获取文件中的所有行

    现在您可以使用 fileinput 模块使用 join 完成您的任务

    import fileinput
    files= ['package-lock.json', 'sqldump.sql', 'felony.json', 'maindata.csv']
    allfiles = fileinput.input(files)
    all_text = ''.join(allfiles)
    

    请参阅this answer 了解将文件连接成字符串的最有效方法。

    建议:正如您提到的会有数百万行,您是否考虑过将其存储在变量中所消耗的内存?因此,最好在读取行时立即执行您计划执行的操作,而不是将其存储在变量中。

    【讨论】:

    • 我尝试了使用“fileinput”模块的代码,但它给了我一个 MemoryError。我的系统有 8GB RAM,目录中 550 个文件的总大小约为 2.3 GB。任何想法如何避免这种情况?
    • 可能是您的机器没有足够的可用 RAM,或者您的操作系统将 Python 限制为仅一定数量的 RAM。尽管如此,正如我建议的那样,您最好立即对这些文件执行任何计划,而不是添加它们,因为打开文件会消耗内存,而字符串又会消耗内存。所以你使用了大量的内存,这首先是低效的。
    猜你喜欢
    • 2020-12-30
    • 2010-10-11
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 2012-02-02
    • 2014-06-05
    相关资源
    最近更新 更多