【问题标题】:Find all CSV files in a directory using Python使用 Python 查找目录中的所有 CSV 文件
【发布时间】:2012-03-03 07:44:24
【问题描述】:

如何在 python 中找到扩展名为 .csv 的目录中的所有文件?

【问题讨论】:

标签: python csv file directory find


【解决方案1】:
import os
import glob

path = 'c:\\'
extension = 'csv'
os.chdir(path)
result = glob.glob('*.{}'.format(extension))
print(result)

【讨论】:

  • 这是一个简短的解决方案,但请注意,这只扫描当前目录(运行脚本的位置)。要更改该使用 os.chdir("/mydir"),此处提供:stackoverflow.com/questions/3964681/…
  • @ppasler 您好,已根据您的建议编辑了答案。我也认为现在它更像pythonic :)
  • 有没有办法在不改变目录的情况下做到这一点?我们不能将目录指定为 glob 命令本身的一部分吗?
【解决方案2】:
from os import listdir

def find_csv_filenames( path_to_dir, suffix=".csv" ):
    filenames = listdir(path_to_dir)
    return [ filename for filename in filenames if filename.endswith( suffix ) ]

函数find_csv_filenames() 以字符串形式返回文件名列表,这些文件名位于path_to_dir 目录中,并带有给定的后缀(默认为“.csv”)。

附录

如何打印文件名:

filenames = find_csv_filenames("my/directory")
for name in filenames:
  print name

【讨论】:

  • 我在处理这段代码时遇到了问题,我试图使用 csv = csv.reader(open(filenames, 'rb')) 及其给我一个错误“强制转换为 unicode:需要字符串或缓冲区”你能帮我吗?如果可以的话,非常感谢。
【解决方案3】:

通过使用过滤器和 lambda 的组合,您可以轻松过滤掉给定文件夹中的 csv 文件。

import os

all_files = os.listdir("/path-to-dir")    
csv_files = list(filter(lambda f: f.endswith('.csv'), all_files))

# lambda returns True if filename (within `all_files`) ends with .csv or else False
# and filter function uses the returned boolean value to filter .csv files from list files.

【讨论】:

    【解决方案4】:

    使用 Python OS 模块在目录中查找 csv 文件。

    简单的例子在这里:

    import os
    
    # This is the path where you want to search
    path = r'd:'
    
    # this is the extension you want to detect
    extension = '.csv'
    
    for root, dirs_list, files_list in os.walk(path):
        for file_name in files_list:
            if os.path.splitext(file_name)[-1] == extension:
                file_name_path = os.path.join(root, file_name)
                print file_name
                print file_name_path   # This is the full path of the filter file
    

    【讨论】:

      【解决方案5】:

      我必须获取子目录中的 csv 文件,因此,使用来自 tchlpr 的响应,我对其进行了修改以最适合我的用例:

      import os
      import glob
      
      os.chdir( '/path/to/main/dir' )
      result = glob.glob( '*/**.csv' )
      print( result )
      

      【讨论】:

        【解决方案6】:
        import os
        
        path = 'C:/Users/Shashank/Desktop/'
        os.chdir(path)
        
        for p,n,f in os.walk(os.getcwd()):
            for a in f:
                a = str(a)
                if a.endswith('.csv'):
                    print(a)
                    print(p)
        

        这将有助于识别这些 csv 文件的路径

        【讨论】:

        • 这将有助于识别这些 csv 文件的路径。
        • 请使用edit 为您的答案添加信息,而不是作为评论添加。也可以使用 Ctrl + K 格式化代码
        【解决方案7】:

        您可以将globrecursive = true 一起使用,** 模式将匹配任何文件以及零个或多个目录、子目录和目录的符号链接。

        import glob, os
        
        os.chdir("C:\\Users\\username\\Desktop\\MAIN_DIRECTORY")
        
        for file in glob.glob("*/.csv", recursive = true):
            print(file)
        

        【讨论】:

          【解决方案8】:

          虽然 thclpr 提供的解决方案有效,但它仅扫描目录中的即时文件,而不扫描子目录中的文件(如果有)。虽然这不是要求,但以防万一有人希望扫描子目录太下面是使用os.walk的代码

          import os
          from glob import glob
          PATH = "/home/someuser/projects/someproject"
          EXT = "*.csv"
          all_csv_files = [file
                           for path, subdir, files in os.walk(PATH)
                           for file in glob(os.path.join(path, EXT))]
          print(all_csv_files)
          

          复制自 this 博客。

          【讨论】:

            【解决方案9】:

            此解决方案使用 python 函数过滤器。此函数创建一个函数返回 true 的元素列表。在这种情况下,使用的匿名函数是在使用 os.listdir('the path i want to look in') 获得的目录文件列表的每个元素上部分匹配“.csv”

            import os
            
            filepath= 'filepath_to_my_CSVs'  # for example: './my_data/'
            
            list(filter(lambda x: '.csv' in x, os.listdir('filepath_to_my_CSVs')))
            

            【讨论】:

            • 请解释这段代码如何解决OP的问题。
            【解决方案10】:

            使用python glob模块轻松列出我们需要的文件。

            import glob
            path_csv=glob.glob("../data/subfolrder/*.csv")
            

            【讨论】:

              【解决方案11】:

              许多(链接的)答案使用os.chdir() 更改工作目录。但你不必这样做。

              递归打印/home/project/目录下的所有CSV文件:

              pathname = "/home/project/**/*.csv"
              
              for file in glob.iglob(pathname, recursive=True):
                  print(file)
              

              需要 python 3.5+。来自文档 [1]:

              • pathname 可以是绝对的(如/usr/src/Python-1.5/Makefile)或相对的(like ../../Tools/*/*.gif
              • pathname 可以包含 shell 样式的通配符。
              • 结果是否排序取决于文件系统。
              • 如果 recursive 为真,则模式 ** 将匹配任何文件以及零个或多个目录、子目录和目录的符号链接

              [1]https://docs.python.org/3/library/glob.html#glob.glob

              【讨论】:

                【解决方案12】:

                您可以将globrecursive = True 一起使用,** 模式将匹配任何文件以及零个或多个目录、子目录和目录的符号链接。

                import glob, os
                
                os.chdir("C:\\Users\\username\\Desktop\\MAIN_DIRECTORY")
                
                for file in glob.glob("*/*.csv", recursive = True):
                    print(file)
                

                【讨论】:

                  【解决方案13】:

                  请使用这个经过测试的工作代码。此函数将返回您指定路径中具有绝对 CSV 文件路径的所有 CSV 文件的列表。

                  import os
                  from glob import glob
                  
                  def get_csv_files(dir_path, ext):
                      os.chdir(dir_path)
                      return list(map(lambda x: os.path.join(dir_path, x), glob(f'*.{ext}')))
                  
                  print(get_csv_files("E:\\input\\dir\\path", "csv"))
                  

                  【讨论】:

                    猜你喜欢
                    • 2016-02-03
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-08-07
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-09-16
                    • 2011-02-21
                    • 1970-01-01
                    相关资源
                    最近更新 更多