【问题标题】:How to specify not full path for pandas.read_csv()? [duplicate]如何为 pandas.read_csv() 指定非完整路径? [复制]
【发布时间】:2018-01-10 03:37:16
【问题描述】:

我正在使用this tutorial,我正在使用 pandas 来通过。

这是我输入并收到错误的代码片段:

users = pd.read_csv('ml-100k//u.users', sep = '|', names = ['User ID', 'Age','Gender', 'Occupation','Zip Code'])

以上代码产生的错误:

Traceback (most recent call last):
  File "<pyshell#33>", line 1, in <module>
    users = pd.read_csv('ml-100k//u.users', sep = '|', names = ['User ID', 'Age','Gender', 'Occupation','Zip Code'])
  File "C:\Program Files\Python 3.5\lib\site-packages\pandas\io\parsers.py", line 709, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "C:\Program Files\Python 3.5\lib\site-packages\pandas\io\parsers.py", line 449, in _read
    parser = TextFileReader(filepath_or_buffer, **kwds)
  File "C:\Program Files\Python 3.5\lib\site-packages\pandas\io\parsers.py", line 818, in __init__
    self._make_engine(self.engine)
  File "C:\Program Files\Python 3.5\lib\site-packages\pandas\io\parsers.py", line 1049, in _make_engine
    self._engine = CParserWrapper(self.f, **self.options)
  File "C:\Program Files\Python 3.5\lib\site-packages\pandas\io\parsers.py", line 1695, in __init__
    self._reader = parsers.TextReader(src, **kwds)
  File "pandas\_libs\parsers.pyx", line 402, in pandas._libs.parsers.TextReader.__cinit__
  File "pandas\_libs\parsers.pyx", line 718, in pandas._libs.parsers.TextReader._setup_parser_source
FileNotFoundError: File b'ml-100k//u.users' does not exist

我想出了如何通过写作使其工作:

users = pd.read_csv(r'C:\\Users\\User\\Documents\\Python3\\ml-100k\\ml-100k\\u.user', sep = '|', names = ['User ID', 'Age','Gender', 'Occupation','Zip Code'])

有没有更简单的方法可以在不写入完整文件路径的情况下做到这一点?我使用的是 Windows 64 Pro。

【问题讨论】:

  • 如果你从ml-100k文件夹启动python shell,你可以只指定文件名而不是整个路径,因为工作目录是`c:\...\ml-100k `
  • 'ml-100k//u.users' - 问题可能出在两个正斜杠上。尝试一个正斜杠。在 Windows 中,您可以使用单个正斜杠 / 或双反斜杠 \\` as a separator. Or, if you make it a raw string, a single backslash r"\"`,

标签: python python-3.x pandas traceback


【解决方案1】:

我发现使用pathlib 模块很有用。我在脚本之上(或在专用文件中)创建 Path 对象,如下所示:

from pathlib import Path
path_1 = Path(r'C:\Users\User\Documents\Python3\ml-100k\ml-100k') # absolute path
path_2 = Path.cwd() # current working directory

那么这对您的其余脚本很有帮助。您可以像这样使用这些对象:

user = pd.read_csv(path_2.joinpath('u.users'), sep = '|', names = ['User ID', 'Age','Gender', 'Occupation','Zip Code'])

【讨论】:

    【解决方案2】:

    pandas.read_csv() documentation中指定路径有多种方式:

    filepath_or_bufferstrpathlib.Pathpy._path.local.LocalPath 或任何具有read() 方法的对象(例如文件句柄或StringIO

    字符串可以是 URL。有效的 URL 方案包括 http、ftp、s3 和文件。对于文件 URL,需要一个主机。例如,本地文件可以是文件://localhost/path/to/table.csv

    • pathlib.Path(*pathsegments)

      PurePath 的子类,该类表示系统路径风格的具体路径(实例化它会创建 PosixPathWindowsPath):

      >>> Path('setup.py')
      PosixPath('setup.py')
      

      pathsegments 的指定类似于PurePath

    • pathlib.WindowsPath(*pathsegments)

      PathPureWindowsPath 的子类,该类代表具体的 Windows 文件系统路径:

      >>> WindowsPath('c:/Program Files/')
      WindowsPath('c:/Program Files')
      

      pathsegments 的指定类似于PurePath

    • io.TextIOBase

      文本流的基类。此类为流式 I/O 提供了一个基于字符和行的接口。没有readinto() 方法,因为Python 的字符串是不可变的。它继承IOBase。没有公共构造函数。 TextIOBase 提供或覆盖这些数据属性和方法,以及来自IOBase 的那些:

      read(size)

      从流中读取并返回最多 size 个字符作为单个 str。如果 size 为负数或None,则读取直到 EOF。

    TextIOBase 提供或覆盖这些数据属性和方法,以及来自 IOBase 的那些:

    我还发现question about path specifying in Windows,答案说,它可以通过多种方式完成:

    • 你可以一直使用:

      'C:/mydir'
      
    • 这适用于 linux 和 windows。其他可能性是

      'C:\\mydir'
      
    • 如果您对某些名称有疑问,您也可以尝试原始字符串:

      r'C:\mydir'
      
    • 然而最佳实践是使用 os.path 模块函数 始终为您的操作系统选择正确的配置:

      os.path.join(mydir, myfile)
      

    TLDR:最简单且最简单的方法是将路径变量指定为

    CSV_FILE = r'C:\Users\User\Documents\Python3\ml-100k\ml-100k\u.user'
    

    CSV_FILE = 'C:\\Users\\User\\Documents\\Python3\\ml-100k\\ml-100k\\u.user'
    

    更好,虽然仍然是简单的方法

    CSV_FILE = os.path.join('C:', 'Users', 'User', 'Documents', 'Python3', 'ml-100k', 'ml-100k', 'u.user')
    

    您还可以指定相对于您的工作目录的路径(例如,如果您的脚本位于C:\Users\User\Documents\Python3\ml-100k\ml-100k,您可以简单地指定文件名:

    CSV_FILE = 'u.user'
    

    您也可以指定 URL,如顶部所述。

    【讨论】:

      猜你喜欢
      • 2021-04-24
      • 2012-12-29
      • 1970-01-01
      • 2019-10-26
      • 2017-03-16
      • 2018-12-02
      • 2022-06-18
      • 2012-10-20
      相关资源
      最近更新 更多