首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加快文件读写速度

加快文件读写速度
EN

Stack Overflow用户
提问于 2020-05-19 18:19:37
回答 1查看 117关注 0票数 0

我希望做到这一点,并在可能的情况下更快地做到这一点:

  1. 浏览了一个users列表。
  2. 读取目录中的所有文件,其中的名称包括用户的名称。
  3. 获取每个此类文件的内容,并将其串联到每个用户的一个文件中。

我有这段代码,但是它非常慢:

代码语言:javascript
复制
for u in users:
    content = ""
    contentfiles = glob.glob("raw_data/" + "*_" + str(u) + ".txt")
    for c in contentfiles:
        txt = open(c, "r").read()
        content += txt
    with open("docs/" + str(u) + ".txt", "w") as outfile:
        outfile.write(content)

是否有更快的方法来实现这一目标?我有400 k用户,它以每秒大约一个文件的速度运行= 18小时。

编辑:将glob从循环中移出将产生更快的结果

代码语言:javascript
复制
datafiles = glob.glob("raw_data/*.txt")   

for u in users:
        content = ""
        filestring = "_" + str(u) + ".txt"
        contentfiles = [i for i in datafiles if filestring in i]
        for c in contentfiles:
            txt = open(c, "r").read()
            content += txt
EN

回答 1

Stack Overflow用户

发布于 2020-05-20 07:49:54

假设glob是瓶颈,那么在编辑中列表过滤是新的瓶颈,下面是一个命题:

如果

  • glob移出循环,使其只在
  • 执行列表筛选一次,如果
  • 没有将内容存储在临时变量

代码语言:javascript
复制
datafiles = glob.glob("raw_data/*.txt")   
userfiles = {} # Dictionary of "user: [file list]"

# Prepare the file list
for file in datafiles:
    user = file.split('.')[-2].split('_')[-1]
    ufiles = userfiles.get(user, default=[])
    ufiles.append(file)
    userfiles[user] = ufiles

# Loop over the list
for user, ufiles in userfiles.items():
    with open("docs/{}.txt".format(user), "w") as outfile:
        for infile in ufiles:
            outfile.write(infile.read())

您甚至完全可以不过滤每个用户的文件,只需在datafiles中遍历任意排序的文件。这意味着以附加模式( outfile )打开a,这样就不会用用户的每个新文件覆盖原始内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61898037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档