【问题标题】:Extract file name from read_csv - Python从 read_csv 中提取文件名 - Python
【发布时间】:2018-10-24 13:23:27
【问题描述】:

我有一个脚本,当前从 .csv 文件读取原始数据并对数据执行一些 pandas 数据分析。目前 .csv 文件是硬编码的,读取方式如下:

data = pd.read_csv('test.csv',sep="|", names=col)

我想改变两件事:

  1. 我想把它变成一个循环,这样它就会遍历一个 .csv 文件的目录,并在脚本中每个文件下面执行 pandas 分析。

  2. 我想获取每个 .csv 文件并剥离“.csv”并将其存储在另一个列表变量中,我们称之为“new_table_list”。

我想我需要像下面这样的东西,至少在第一点(尽管我知道这并不完全正确)。我不知道如何解决第二点

感谢任何帮助

import os 

path = '\test\test\csvfiles'
table_list = []

for filename in os.listdir(path):
    if filename.endswith('.csv'):
        table_list.append(file)
data = pd.read_csv(table_list,sep="|", names=col)

【问题讨论】:

  • 你需要使用os.path.join(path, filename)来获取要读取的文件的全名
  • read_csv 的第一个参数必须是文件名,而不是文件名列表。
  • @Barmar 啊,好的。所以 read_csv 不能带参数?必须是单个文件名吗?好的,我需要改变我认为的方法。谢谢
  • 是的,它需要一个参数。该参数必须是可以读取的文件名或已打开的文件对象。
  • read_csv 一次只能读取一个 CSV 文件,不能读取table_list 中的所有文件。

标签: python string pandas


【解决方案1】:

很多方法

for filename in os.listdir(path):
    if filename.endswith('.csv'):
        table_list.append(pd.read_csv(filename,sep="|"))
        new_table_list.append(filename.split(".")[0])

还有一个

for filename in os.listdir(path):
    if filename.endswith('.csv'):
        table_list.append(pd.read_csv(filename,sep="|"))
        new_table_list.append(filename[:-4])

还有更多

正如@barmar 指出的那样,最好将路径也附加到table_list 以避免与文件和脚本的路径和位置相关的任何问题。

【讨论】:

  • table_list.append(file) 中的file 是什么?您肯定想在某处附加一些有用的东西,例如 `pd.read_csv(pathname, sep='|', names=col)``,而不仅仅是将两个不同版本的文件名添加到两个不同的列表中?
  • @abarnert 是的,这更有意义。虽然我只是试图解决第二部分。会编辑。非常感谢。
【解决方案2】:

你可以试试这样的:

import glob

data = {}
for filename in glob.glob('/path/to/csvfiles/*.csv'):
    data[filename[:-4]] = pd.read_csv(filename, sep="|", names=col)

那么data.keys() 是不带“.csv”部分的文件名列表,data.values() 是每个文件都有一个 pandas 数据框的列表。

【讨论】:

    【解决方案3】:

    使用glob获取目录中的列表CSV文件比os更容易

    from glob import glob 
    
    # csvs will contain all CSV files names ends with .csv in a list
    csvs = glob('you\\dir\\to\\csvs_folder\\*.csv')
    
    # remove the trailing .csv from CSV files names
    new_table_list = [csv[:-3] for csv in csvs]
    
    # read csvs as dataframes
    dfs = [pd.read_csv(csv, sep="|", names=col) for csv in csvs]
    
    #concatenate all dataframes into a single dataframe
    df = pd.concat(dfs, ignore_index=True)
    

    【讨论】:

    • 您可能希望将反斜杠加倍,使用原始字符串或用正斜杠替换它们(即使当前操作系统的路径分隔符是反斜杠,大多数库都使用正斜杠路径) .在您的示例中,文字中的 \to 将被解释为 0x09o
    • 是的,我忘记了。谢谢!
    【解决方案4】:

    你可以试试:

    import os
    path = 'your path'
    all_csv_files = [f for f in os.listdir(path) if f.endswith('.csv')]
    for f in all_csv_files:
        data = pd.read_csv(os.path.join(path, f), sep="|", names=col)
    
    # list without .csv
    files = [f[:-4] for f all_csv_files]
    

    【讨论】:

      【解决方案5】:

      我会先使用pathlib

      from pathlib import Path
      

      然后利用stem 属性和glob 方法。

      让我们做一个导入函数。

      def read_csv(f):
          return pd.read_csv(table_list, sep="|")
      

      最通用的方法是存储在字典中。

      p = Path('\test\test\csvfiles')
      dod = {f.stem: read_csv(f) for f in p.glob('*.csv')}
      

      您还可以使用pd.concat 将其转换为数据框。

      df = pd.concat(dod)
      

      【讨论】:

        【解决方案6】:

        您可以(在打开时)将文件名添加到 Dataframe 属性,如下所示:

         ds.attrs['filename']='filename.csv'
        

        您可以随后查询数据框的名称

         ds.attrs['filename']
        'filename.csv'
        

        【讨论】:

          猜你喜欢
          • 2010-10-07
          • 2018-08-02
          • 2013-03-03
          • 1970-01-01
          • 2021-03-26
          • 1970-01-01
          • 2018-09-02
          • 2021-08-14
          • 2021-08-31
          相关资源
          最近更新 更多