为啥 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 你是对的。我没有注意到其中一个字符串以 \ 结尾,这仍然被误认为是转义。请参阅我的更新答案。 @BilltheLizardos.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错误