为啥 pd.read_csv 不接受 Windows 文件路径中的变量名?

Posted

技术标签:

【中文标题】为啥 pd.read_csv 不接受 Windows 文件路径中的变量名?【英文标题】:Why won't pd.read_csv accept a variable name within the file path in windows?为什么 pd.read_csv 不接受 Windows 文件路径中的变量名? 【发布时间】:2021-10-28 17:28:35 【问题描述】:

我正在尝试将变量名放入文件路径中,以在 Windows 中使用 spyder 5、python 3.7.9 打开 csv。它在树莓派和 Ubuntu 上运行良好,但我无法弄清楚 Windows 文件路径约定。代码如下

import pandas as pd


#%% 
needle_size = '14mm_'
Pressure = '5mb'
test_var = needle_size+Pressure

prelim = pd.read_csv('C:\Users\Edwardtx\Downloads\Tomsstuff\data_pp_kvals\test2\Inner\14mm\'+test_var+'.csv') 

我得到一个红色圆圈的错误,屏幕左侧中间有一个白色十字,它说

'EOL 同时扫描字符串文字 pyflakes E'

对我来说也很奇怪的是,通常可以用作变量的文本在加号之间变为黑色,而不是在字符串时变为绿色。在上面的示例中,.csv 是黑色的,其余的是绿色的,为什么?

此外,我尝试分别在路径前添加 r 和后添加 ,'rb',但无济于事。

【问题讨论】:

【参考方案1】:

文件路径中的\ 被误认为是转义字符。不幸的是,即使是原始字符串也不能以反斜杠 (\) 字符结尾,因为结尾的引号仍然会被转义。尝试分别定义路径和文件名,然后使用格式字符串将它们连接起来。

path = r"C:\Users\Edwardtx\Downloads\Tomsstuff\data_pp_kvals\test2\Inner\14mm"
filename = test_var + ".csv"
file_path = r"%s\%s" % (path, filename)

prelim = pd.read_csv(file_path)

参考:String and Bytes literals

【讨论】:

感谢 Bill 的链接,但正如我在代码下方所述,我尝试将其设为原始字符串,但没有成功。也没有将其设为 f 弦。我收到以下错误 'SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape 另外,我已经编辑了我的答案,以防我使用的 python 版本是很重要。 @TomEdwards 你是对的。我没有注意到其中一个字符串以 \ 结尾,这仍然被误认为是转义。请参阅我的更新答案。 @BilltheLizard os.path.sep 可能是更灵活的选择...【参考方案2】:

\ 被读取为转义序列的开头。您应该改用f-string:

prelim = pd.read_csv(f'C:\Users\Edwardtx\Downloads\Tomsstuff\data_pp_kvals\test2\Inner\14mm\test_var.csv') 

这当然是假设您使用的是 Python 3.6+。

您还可以将默认的\ Windows 路径分隔符更改为/

prelim = pd.read_csv('C:/Users/Edwardtx/Downloads/Tomsstuff/data_pp_kvals/test2/Inner/14mm/' + test_var + '.csv')

这可以正常工作,但您必须确保它不是原始字符串。

然而,真正 Pythonic 的答案是使用os.path。例如:

>>> import os.path
>>> test_var = "foo"
>>> base_path = r"C:\Users\Edwardtx\Downloads\Tomsstuff\data_pp_kvals\test2\Inner\14mm"
# note the raw string and lack of trailing \
>>> full_path = os.path.join(base_path, test_var + ".csv")
>>> print(full_path)
'C:\\Users\\Edwardtx\\Downloads\\Tomsstuff\\data_pp_kvals\\test2\\Inner\\14mm\\foo.csv'

os.path.join() 将其参数与os.path.sep 连接起来,这取决于系统。

【讨论】:

感谢 MattDMo,但正如我在代码下方所述,我尝试将其设为原始字符串,但没有成功。也没有将其设为 f 弦。我收到以下错误 'SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape 另外,我已经编辑了我的答案,以防我使用的 python 版本是很重要。 @TomEdwards 尝试将\s 更改为/s。您收到 Unicode 错误的原因是 \UXXXXXXXX 是 Unicode 代码点的 Python 转义码。它试图将\Users\Edwa 解释为十六进制,但失败了。 Windows Python 可以很好地处理带有/ 分隔符的文件路径。将所有\ 分隔符更改为\\ 的另一个选项。 我将所有的 \ 分隔符都切换为 \\ 得到以下错误。 FileNotFoundError: [Errno 2] 没有这样的文件或目录:'C:\\\\Users\\\\Edwardtx\\\\Downloads\\\\Tomsstuff\\\\data_pp_kvals\\\\test2\\\\Inner \\\\14mm\\\\14mm_5mb_.csv' 这是怎么回事??还尝试使用 \s 到 /s 并得到一个无效的语法错误.... @TomEdwards 路径应该是C:/Users/Edwardtx/Downloads/Tomsstuff/data_pp_kvals/test2/Inner/14mm/' + test_var + '.csv''C:\\Users\\Edwardtx\\Downloads\\Tomsstuff\\data_pp_kvals\\test2\\Inner\\14mm\\' + test_var + '.csv' 对不起,如果我的评论不清楚,但我尝试了两个替换 MattDMo,但都没有成功。如错误中所述,双反斜杠被解释为四倍反斜杠。【参考方案3】:

您可以通过以下方式使用 f-string 来读取 CSV 文件

示例:

import pandas as pd


#%% 
needle_size = '14mm_'
Pressure = '5mb'
test_var = needle_size+Pressure

prelim = pd.read_csv(f'C:\Users\Edwardtx\Downloads\Tomsstuff\data_pp_kvals\test2\Inner\14mm\test_var.csv') 

【讨论】:

以上是关于为啥 pd.read_csv 不接受 Windows 文件路径中的变量名?的主要内容,如果未能解决你的问题,请参考以下文章

1.0作为boolean dtype在pd.read_csv()中引起ValueError。

python关于pd.read_csv()的Permission denied错误

pd.read_csv 如果逗号在括号内,则忽略它

Pandas总结第二节 Pandas 的数据读取_pd.read_csv()的使用详解(非常全面,推荐收藏)

如何为 Pandas pd.read_csv 设置代理

[Python Study Notes]pd.read_csv()函数读取csv文件绘图