使用os.path.join时路径反斜杠重复触发FileNotFoundError求助
使用os.path.join拼接路径时反斜杠重复导致FileNotFoundError的解决方法
我尝试用os.path.join读取Pandas DataFrame,哪怕用了原始字符串(raw string),路径里的反斜杠还是会重复。单独定义基础路径caminho_padrao时显示正常,但调用os.path.join拼接文件名后,反斜杠就重复了,最后触发FileNotFoundError。
相关代码
import pandas as pd import os #importando os arquivos caminho_padrao = r'C:\Users\user\OneDrive\Área de Trabalho\Modulo 1\Python PowerBI' vendas_df = pd.read_csv(os.path.join(caminho_padrao, r'Contoso - Vendas - 2017.csv'), sep=';') produtos_df = pd.read_csv(os.path.join(caminho_padrao, r'Contoso - Cadastro Produtos.csv'), sep=';') lojas_df = pd.read_csv(os.path.join(caminho_padrao, r'Contoso - Lojas.csv'), sep=';') clientes_df = pd.read_csv(os.path.join(caminho_padrao, r'Contoso - Clientes.csv'), sep=';') #limpando apenas as colunas que queremos clientes_df = clientes_df[['ID Cliente', 'E-mail']] produtos_df = produtos_df[['ID Produto', 'Nome do Produto']] lojas_df = lojas_df[['ID Loja', 'Nome da Loja']] #mesclando e renomeando os dataframes vendas_df = vendas_df.merge(produtos_df, on='ID Produto') vendas_df = vendas_df.merge(lojas_df, on='ID Loja') vendas_df = vendas_df.merge(clientes_df, on='ID Cliente').rename(columns={'E-mail': 'E-mail do Cliente'}) display(vendas_df)
报错信息
--------------------------------------------------------------------------- FileNotFoundError Traceback (most recent call last) Cell In [2], line 5 3 #importando os arquivos 4 caminho_padrao = r'C:\Users\user\OneDrive\Área de Trabalho\Modulo 1\Python PowerBI' ----> 5 vendas_df = pd.read_csv(os.path.join(caminho_padrao, r'Contoso - Vendas - 2017.csv'), sep=';') 6 produtos_df = pd.read_csv(os.path.join(caminho_padrao, r'Contoso - Cadastro Produtos.csv'), sep=';') 7 lojas_df = pd.read_csv(os.path.join(caminho_padrao, r'Contoso - Lojas.csv'), sep=';') File ~\AppData\Local\Programs\Python\Python311\Lib\site-packages\pandas\util\_decorators.py:211, in deprecate_kwarg.<locals>._deprecate_kwarg.<locals>.wrapper(*args, **kwargs) 209 else: 210 kwargs[new_arg_name] = new_arg_value --> 211 return func(*args, **kwargs) File ~\AppData\Local\Programs\Python\Python311\Lib\site-packages\pandas\util\_decorators.py:331, in deprecate_nonkeyword_arguments.<locals>.decorate.<locals>.wrapper(*args, **kwargs) 325 if len(args) > num_allow_args: 326 warnings.warn( 327 msg.format(arguments=_format_argument_list(allow_args)), 328 FutureWarning, 329 stacklevel=find_stack_level(), 330 ) --> 331 return func(*args, **kwargs) File ~\AppData\Local\Programs\Python\Python311\Lib\site-packages\pandas\io\parsers\readers.py:950, in read_csv(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, error_bad_lines, warn_bad_lines, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options) 935 kwds_defaults = _refine_defaults_read( 936 dialect, 937 delimiter, (...) 946 defaults={"delimiter": ","}, 947 ) 948 kwds.update(kwds_defaults) --> 950 return _read(filepath_or_buffer, kwds) File ~\AppData\Local\Programs\Python\Python311\Lib\site-packages\pandas\io\parsers\readers.py:605, in _read(filepath_or_buffer, kwds) 602 _validate_names(kwds.get("names", None)) 604 # Create the parser. --> 605 parser = TextFileReader(filepath_or_buffer, **kwds) 607 if chunksize or iterator: 608 return parser File ~\AppData\Local\Programs\Python\Python311\Lib\site-packages\pandas\io\parsers\readers.py:1442, in TextFileReader.__init__(self, f, engine, **kwds) 1439 self.options["has_index_names"] = kwds["has_index_names"] 1441 self.handles: IOHandles | None = None --> 1442 self._engine = self._make_engine(f, self.engine) File ~\AppData\Local\Programs\Python\Python311\Lib\site-packages\pandas\io\parsers\readers.py:1735, in TextFileReader._make_engine(self, f, engine) 1733 if "b" not in mode: 1734 mode += "b" --> 1735 self.handles = get_handle( 1736 f, 1737 mode, 1738 encoding=self.options.get("encoding", None), 1739 compression=self.options.get("compression", None), 1740 memory_map=self.options.get("memory_map", False), 1741 is_text=is_text, 1742 errors=self.options.get("encoding_errors", "strict"), 1743 storage_options=self.options.get("storage_options", None), 1744 ) 1745 assert self.handles is not None 1746 f = self.handles.handle File ~\AppData\Local\Programs\Python\Python311\Lib\site-packages\pandas\io\common.py:856, in get_handle(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options) 851 elif isinstance(handle, str): 852 # Check whether the filename is to be opened in binary mode. 853 # Binary mode does not support 'encoding' and 'newline'. 854 if ioargs.encoding and "b" not in ioargs.mode: 855 # Encoding --> 856 handle = open( 857 handle, 858 ioargs.mode, 859 encoding=ioargs.encoding, 860 errors=errors, 861 newline="", 862 ) 863 else: 864 # Binary mode 865 handle = open(handle, ioargs.mode) FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\user\\OneDrive\\Área de Trabalho\\Modulo 1\\Python PowerBI\\Contoso - Vendas - 2017.csv'
问题分析与解决方法
核心误区:反斜杠重复是显示问题
报错里的双反斜杠\\只是Python字符串的转义显示,不是实际路径内容。Python打印字符串时会把单个反斜杠显示成双反斜杠,避免和\n这类转义字符混淆,实际传给系统的路径还是单个反斜杠,所以这不是报错的真正原因。
真正的问题及解决
文件不存在或路径错误
- 把报错里的路径(去掉外层引号和转义,即
C:\Users\user\OneDrive\Área de Trabalho\Modulo 1\Python PowerBI\Contoso - Vendas - 2017.csv)复制到文件资源管理器地址栏,确认文件是否存在。 - 检查文件名拼写:注意空格、大小写(Windows不区分大小写但要完全匹配)、特殊字符,比如代码里的
Contoso - Vendas - 2017.csv有两个连续空格,要确认实际文件名是否一致。
- 把报错里的路径(去掉外层引号和转义,即
OneDrive同步问题
- OneDrive的文件夹可能是仅在线的占位符,需要右键文件选择“始终保留在此设备上”,确保文件下载到本地。
- 检查OneDrive实际路径:有时候OneDrive路径会带有后缀(比如
C:\Users\user\OneDrive - 你的公司名),右键OneDrive图标→设置→账户→查看位置,确认实际路径。
路径特殊字符处理
路径里的Área de Trabalho包含带重音的Á,可能导致编码问题,可尝试以下方法:- 改用相对路径:把代码文件放到CSV文件所在的文件夹,直接写文件名读取:
vendas_df = pd.read_csv('Contoso - Vendas - 2017.csv', sep=';') - 用正斜杠替代反斜杠:Windows系统也支持正斜杠作为路径分隔符:
caminho_padrao = 'C:/Users/user/OneDrive/Área de Trabalho/Modulo 1/Python PowerBI'
- 改用相对路径:把代码文件放到CSV文件所在的文件夹,直接写文件名读取:
优化代码写法
文件名不需要用原始字符串,os.path.join会自动处理路径分隔符,简化代码:vendas_df = pd.read_csv(os.path.join(caminho_padrao, 'Contoso - Vendas - 2017.csv'), sep=';')
内容的提问来源于stack exchange,提问作者Gabriel Rodrigues
相关产品推荐
相关产品推荐

