【问题标题】:Reading and writing files in order - Python按顺序读写文件 - Python
【发布时间】:2013-09-25 06:18:09
【问题描述】:

抱歉,python 作为一门语言很新。

所以我有 5 个文件。 item1.txt、item2.txt、item3.txt、item4.txt 和 item5.txt。 我试图调用目录,以便它挑选出第一个文件(item1.txt)并打印其内容,然后当我再次调用该函数(item2.txt)并打印文件中的内容时......然后是 (item3.txt),然后是 (item4.txt)。

顺序很重要,系统必须知道打印了哪个文件,以便行中的下一个文件可以在第一个文件之后打印,例如。 item1.txt 的内容先打印,然后是 item2.txt。

尝试使用:

for infile in sorted(glob.glob('*.txt')):
    print "Current File Being Processed is: " + infile

但问题是需要添加目录并且系统需要知道在它之前打印了什么文件及其内容。

抱歉,如果这让您感到困惑。

帮助表示赞赏。

【问题讨论】:

    标签: python


    【解决方案1】:

    如果需要知道完整路径,可以使用 os.path.join。

    例如,搜索当前目录中所有文件的脚本如下所示:

    import os
    import os.path
    import re
    
    
    # look for all files in current working directory, including subdirs
    for (root, folders, files) in os.walk(os.getcwd()):    
        for file in files:
            fullpath = os.path.join(root, file)
            print(fullpath)
    

    希望这会有所帮助。

    【讨论】:

    • 显示os.path.join 很好,但我认为添加os.walk 会让对glob 感到满意的新手感到困惑。
    【解决方案2】:

    但问题是需要添加目录……

    为此,请使用os.path 中的方法。

    您可以通过pwd = os.getcwd() 获取当前工作目录(glob('*.txt') 正在搜索的同一目录),然后我们os.path.join(pwd, infile)。但是对于只有相对于当前目录的路径的特殊情况,您可能想要的是os.path.abspath。所以:

    for infile in sorted(glob.glob('*.txt')):
        inpath = os.path.abspath(infile)
        print "Current File Being Processed is: " + inpath
    

    并且系统需要知道在它之前打印了什么文件及其内容。

    要获取文件的内容,你必须open它,然后read来自它,像这样:

    for infile in sorted(glob.glob('*.txt')):
        inpath = os.path.abspath(infile)
        print "Current File Being Processed is: " + inpath
        with open(inpath) as infileobj:
            contents = infileobj.read()
        print contents
    

    通常,您并不真的想将整个文件读入一个大字符串,您只想对文件中的每一行做一些工作。为此,您可以只使用for 语句,就像处理从sorted 返回的字符串列表一样,将文件视为一堆行:

    for infile in sorted(glob.glob('*.txt')):
        inpath = os.path.abspath(infile)
        print "Current File Being Processed is: " + inpath
        with open(inpath) as infileobj:
            for line in infileobj:
                print line.rstrip('\n')
    

    (rstrip('\n') 是因为每一行都以换行符结尾,但print 添加了自己的换行符,并且您不希望文件的每一行之间有一个空行。)

    这样做的好处是您不必将整个文件读入内存即可将其打印出来。如果您处理的是小文件,这没什么大不了的,但处理更大的文件会产生很大的不同。

    【讨论】:

      【解决方案3】:

      这是您搜索的内容吗?

      import glob
      path = "path/to/your/txt/files/"
      for infile in sorted(glob.glob(path + '*.txt')):
          print("Current File Being Processed is: " + path + infile)
      

      【讨论】:

      • 可能不会。它在相对路径path/to/your/txt 中搜索文件名files*.txt,如果找到,它将打印出path/to/your/txt/filesfilesfoo.txt。这正是您使用 os.path 而不是字符串函数的方式——因为不可能像您在此处创建的两个那样创建愚蠢的错误。
      • @abarnert:这是一种类型,是的,os.path 可能会更好。编辑了我的答案。
      • 这就是我的观点:如果你犯了我们一直犯的同样的简单错字,你使用的代码会导致大的,有时难以调试的问题,这一事实要重要得多而不是你碰巧确定了一个错字。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-04
      • 1970-01-01
      • 2014-04-21
      • 2014-02-12
      • 2021-03-12
      • 2018-07-06
      相关资源
      最近更新 更多