【问题标题】:How to open my files in data_folder with pandas using relative path?如何使用相对路径使用 pandas 在 data_folder 中打开我的文件?
【发布时间】:2016-05-24 21:17:14
【问题描述】:

我正在使用 pandas,需要读取一些 csv 文件,结构是这样的:

文件夹/folder2/scripts_folder/script.py

文件夹/folder2/data_folder/data.csv

如何从scripts_folder 中的脚本打开data.csv 文件?

我试过了:

absolute_path = os.path.abspath(os.path.dirname('data.csv'))

pandas.read_csv(absolute_path + '/data.csv')

我收到此错误:

File folder/folder2/data_folder/data.csv does not exist

【问题讨论】:

标签: python pandas relative-path


【解决方案1】:

试试

import pandas as pd
pd.read_csv("../data_folder/data.csv")

【讨论】:

  • 其实这是最好的解决方案。
  • 为什么我们不指定所有的父文件夹?
  • 也可以使用 os
  • 感谢您的回答。当我使用双引号而不是单引号时问题已解决。
  • 此解决方案依赖于操作系统。如果您打算在不同的操作系统上运行您的代码,它将失败。使用其他几个成员建议的 os.path.dirname 是一个更强大的解决方案。
【解决方案2】:

Pandas 将从您当前的 python 文件所在的位置开始查找。因此,您可以使用“..”从当前目录移动到数据所在的位置 例如:

pd.read_csv('../../../data_folder/data.csv')

将向上 3 个级别,然后进入一个 data_folder(假设它在那里) 或者

pd.read_csv('data_folder/data.csv')

假设您的 data_folder 与您的 .py 文件位于同一目录中。

【讨论】:

  • 谢谢,这是我作为 python / 机器学习初学者所需要的解释!
【解决方案3】:

对于非 Windows 用户:

import pandas as pd
import os

os.chdir("../data_folder")
df = pd.read_csv("data.csv")

对于 Windows 用户:

import pandas as pd

df = pd.read_csv(r"C:\data_folder\data.csv")

上面 location 中的前缀 r 在将位置提供给 pandas Dataframe 时可以节省时间。

【讨论】:

  • 没有理由导入操作系统。请参阅@ksooklall 的回答。
  • pandas 会自动从您的 notebook 运行的位置查找 CSV 或任何其他数据集文件,但 os.chdir() 只是为了更改您要从中选择多个数据的工作目录位置。也许您有大量数据存储在给定文件夹中,那么如果您想读取 CSV 文件,则无需每次都写入位置。
  • 这有副作用,为了一些感知的方便而忽略这些是不好的做法。我说感知便利是因为另一个答案更短,更易读,并且没有你的不必要的依赖。
  • 对于 windows,这只是工作
【解决方案4】:

您可以使用__file__ 属性:

import os
import pandas as pd
df = pd.read_csv(os.path.join(os.path.dirname(__file__), "../data_folder/data.csv"))

【讨论】:

    【解决方案5】:

    使用f-strings 保持整洁:

    import os
    import pandas as pd
    
    data_files = '../data_folder/'
    csv_name = 'data.csv'
    
    pd.read_csv(f"{data_files}{csv_name}")
    

    【讨论】:

      【解决方案6】:
      # script.py
      current_file = os.path.abspath(os.path.dirname(__file__)) #older/folder2/scripts_folder
      
      #csv_filename
      csv_filename = os.path.join(current_file, '../data_folder/data.csv')
      

      【讨论】:

        【解决方案7】:

        当您使用read_csvpd.read_csv 时,如果使用python 或pandas,它们都会查看当前工作目录,默认情况下python 进程已启动。所以你需要使用os 模块到chdir() 并从那里获取。

        import pandas as pd 
        import os
        print(os.getcwd())
        os.chdir("D:/01Coding/Python/data_sets/myowndata")
        print(os.getcwd())
        df = pd.read_csv('data.csv',nrows=10)
        print(df.head())
        

        【讨论】:

          【解决方案8】:

          如果你想保持整洁,那么我建议你分别分配路径和文件然后阅读:

          path = 'C:/Users/username/Documents/folder'
          file_name = 'file_name.xlsx'
          

          file=pd.read_excel(f"{path}{file_name}")

          【讨论】:

            【解决方案9】:

            我也在寻找相对路径版本,这工作正常。注意运行时(Spyder 3.6)你会看到(unicode error)'unicodeescape'编解码器不能解码结束三引号的字节。删除有问题的注释行 14 和 15,并为您的环境调整文件名和位置,并检查缩进。

            -- 编码:utf-8 --

            """ 创建于 2020 年 1 月 24 日星期五 12:12:40

            来源: Read a .csv into pandas from F: drive on Windows 7

            证明: 通过指定相对路径加载不在 CWD 中的 csv - windows 版本

            @作者:道格

            我们将从 CWD C:\Users\Doug\.spyder-py3\Data Camp\pandas 加载文件

            C:/Users/Doug/.spyder-py3/Data Camp/Cleaning/g1803.csv
            

            """

            import csv
            
            trainData2 = []
            
            with open(r'../Cleaning/g1803.csv', 'r') as train2Csv:
            
              trainReader2 = csv.reader(train2Csv, delimiter=',', quotechar='"')
            
              for row in trainReader2:
            
                  trainData2.append(row)
            
            print(trainData2)
            

            【讨论】:

              【解决方案10】:

              您始终可以使用~ 指向您的主目录,然后您可以参考您的数据文件夹。

              import pandas as pd
              df = pd.read_csv("~/mydata/data.csv")
              

              你的情况应该是这样的

              import pandas as pd
              df = pd.read_csv("~/folder/folder2/data_folder/data.csv")
              

              您还可以将data 目录设置为前缀

              import pandas as pd
              DATA_DIR = "~/folder/folder2/data_folder/"
              df = pd.read_csv(DATA_DIR+"data.csv")
              

              您可以像@nikos-tavoularis 所说的那样利用f-strings

              import pandas as pd
              DATA_DIR = "~/folder/folder2/data_folder/"
              FILE_NAME = "data.csv"
              df = pd.read_csv(f"{DATA_DIR}{FILE_NAME}")
              

              【讨论】:

                【解决方案11】:
                import pandas as pd
                df = pd.read_csv('C:/data_folder/data.csv')
                

                【讨论】:

                • 所提供的答案被标记为低质量帖子以供审核。以下是How do I write a good answer? 的一些指南。此提供的答案不正确,仅代码答案不被视为“好”答案。来自review。 OP 专门针对 relative path 声明,但您已经用 absolute path 回答了这个问题。
                【解决方案12】:

                这个链接在这里回答它。 Reading file using relative path in python project

                基本上使用来自pathlibPath,您将在script.py 中执行以下操作

                from pathlib import Path
                path = Path(__file__).parent / "../data_folder/data.csv"
                pd.read_csv(path)
                

                【讨论】:

                  【解决方案13】:

                  你可以试试这个。

                  df = pd.read_csv("E:\working datasets\sales.csv")
                  print(df.head())
                  

                  【讨论】:

                    【解决方案14】:
                    import os
                    
                    s_path = os.getcwd()
                    # s_path = "...folder/folder2/scripts_folder/script.py"
                    s_path = s_path.split('/')
                    print(s_path)
                    # [,..., 'folder', 'folder2', 'scripts_folder', 'script.py']
                    
                    d_path = s_path[:len(s_path)-2] + ['data_folder', 'data.csv']
                    print(os.path.join(*d_path))
                    # ...folder/folder2/data_folder/data.csv```
                    

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2018-11-30
                      • 2016-03-21
                      • 2011-02-25
                      • 1970-01-01
                      • 1970-01-01
                      • 2021-05-31
                      • 1970-01-01
                      • 2015-05-27
                      相关资源
                      最近更新 更多