【问题标题】:How to open every file in a folder如何打开文件夹中的每个文件
【发布时间】:2013-08-18 05:01:42
【问题描述】:

我有一个 python 脚本 parse.py,它在脚本中打开一个文件,比如 file1,然后做一些事情可能会打印出总字符数。

filename = 'file1'
f = open(filename, 'r')
content = f.read()
print filename, len(content)

现在,我正在使用 stdout 将结果定向到我的输出文件 - 输出

python parse.py >> output

但是,我不想手动逐个文件处理这个文件,有没有办法自动处理每个文件?喜欢

ls | awk '{print}' | python parse.py >> output 

那么问题是如何从标准中读取文件名? 还是已经有一些内置函数可以轻松完成 ls 和这些工作?

谢谢!

【问题讨论】:

    标签: python file pipe stdout stdin


    【解决方案1】:

    操作系统

    您可以使用os.listdir列出当前目录中的所有文件:

    import os
    for filename in os.listdir(os.getcwd()):
       with open(os.path.join(os.getcwd(), filename), 'r') as f: # open in readonly mode
          # do your stuff
    

    全局

    或者您可以仅列出一些文件,具体取决于使用 glob 模块的文件模式:

    import glob
    for filename in glob.glob('*.txt'):
       with open(os.path.join(os.getcwd(), filename), 'r') as f: # open in readonly mode
          # do your stuff
    

    它不必是当前目录,你可以在任何你想要的路径中列出它们:

    path = '/some/path/to/file'
    for filename in glob.glob(os.path.join(path, '*.txt')):
       with open(os.path.join(os.getcwd(), filename), 'r') as f: # open in readonly mode
          # do your stuff
    

    管道 或者你甚至可以使用fileinput指定的管道

    import fileinput
    for line in fileinput.input():
        # do your stuff
    

    然后您可以将它与管道一起使用:

    ls -1 | python parse.py
    

    【讨论】:

    • 这是否也自动处理文件打开和关闭?我很惊讶你没有使用with ... as ...: 语句。你能澄清一下吗?
    • Charlie、glob.glob 和 os.listdir 返回文件名。然后,您将在循环中一一打开。
    【解决方案2】:

    您应该尝试使用os.walk

    import os
    
    yourpath = 'path'
    
    for root, dirs, files in os.walk(yourpath, topdown=False):
        for name in files:
            print(os.path.join(root, name))
            stuff
        for name in dirs:
            print(os.path.join(root, name))
            stuff
    

    【讨论】:

      【解决方案3】:

      您实际上可以只使用os module 来做这两件事:

      1. 列出文件夹中的所有文件
      2. 按文件类型、文件名等对文件进行排序。

      这是一个简单的例子:

      import os #os module imported here
      location = os.getcwd() # get present working directory location here
      counter = 0 #keep a count of all files found
      csvfiles = [] #list to store all csv files found at location
      filebeginwithhello = [] # list to keep all files that begin with 'hello'
      otherfiles = [] #list to keep any other file that do not match the criteria
      
      for file in os.listdir(location):
          try:
              if file.endswith(".csv"):
                  print "csv file found:\t", file
                  csvfiles.append(str(file))
                  counter = counter+1
      
              elif file.startswith("hello") and file.endswith(".csv"): #because some files may start with hello and also be a csv file
                  print "csv file found:\t", file
                  csvfiles.append(str(file))
                  counter = counter+1
      
              elif file.startswith("hello"):
                  print "hello files found: \t", file
                  filebeginwithhello.append(file)
                  counter = counter+1
      
              else:
                  otherfiles.append(file)
                  counter = counter+1
          except Exception as e:
              raise e
              print "No files found here!"
      
      print "Total files found:\t", counter
      

      现在,您不仅列出了文件夹中的所有文件,而且还(可选地)按起始名称、文件类型等对它们进行了排序。刚才遍历每个列表并做你的事情。

      【讨论】:

        【解决方案4】:

        我一直在寻找这个答案:

        import os,glob
        folder_path = '/some/path/to/file'
        for filename in glob.glob(os.path.join(folder_path, '*.htm')):
          with open(filename, 'r') as f:
            text = f.read()
            print (filename)
            print (len(text))
        

        您也可以选择“*.txt”或文件名的其他结尾

        【讨论】:

        • 这是答案,因为您正在读取目录中的所有文件;D
        【解决方案5】:
        import pyautogui
        import keyboard
        import time
        import os
        import pyperclip
        
        os.chdir("target directory")
        
        # get the current directory
        cwd=os.getcwd()
        
        files=[]
        
        for i in os.walk(cwd):
            for j in i[2]:
                files.append(os.path.abspath(j))
        
        os.startfile("C:\Program Files (x86)\Adobe\Acrobat 11.0\Acrobat\Acrobat.exe")
        time.sleep(1)
        
        
        for i in files:
            print(i)
            pyperclip.copy(i)
            keyboard.press('ctrl')
            keyboard.press_and_release('o')
            keyboard.release('ctrl')
            time.sleep(1)
        
            keyboard.press('ctrl')
            keyboard.press_and_release('v')
            keyboard.release('ctrl')
            time.sleep(1)
            keyboard.press_and_release('enter')
            keyboard.press('ctrl')
            keyboard.press_and_release('p')
            keyboard.release('ctrl')
            keyboard.press_and_release('enter')
            time.sleep(3)
            keyboard.press('ctrl')
            keyboard.press_and_release('w')
            keyboard.release('ctrl')
            pyperclip.copy('')
        

        【讨论】:

        • 这会使用 PyPerClip 和 PyAutoGui 打开、打印、关闭目录中的每个 PDF。希望其他人觉得这有帮助。
        【解决方案6】:

        下面的代码读取包含我们正在运行的脚本的目录中可用的任何文本文件。然后它打开每个文本文件并将文本行的单词存储到一个列表中。存储单词后,我们逐行打印每个单词

        import os, fnmatch
        
        listOfFiles = os.listdir('.')
        pattern = "*.txt"
        store = []
        for entry in listOfFiles:
            if fnmatch.fnmatch(entry, pattern):
                _fileName = open(entry,"r")
                if _fileName.mode == "r":
                    content = _fileName.read()
                    contentList = content.split(" ")
                    for i in contentList:
                        if i != '\n' and i != "\r\n":
                            store.append(i)
        
        for i in store:
            print(i)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-14
          • 2021-11-14
          • 1970-01-01
          • 1970-01-01
          • 2021-12-19
          相关资源
          最近更新 更多