为什么 pd.read_csv 不接受 windows 文件路径中的变量名?

Why won't pd.read_csv accept a variable name within the file path in windows?

我正在尝试将一个变量名放入文件路径中,以便在 windows 中使用 spyder 5、python 3.7.9 打开一个 csv。它在 raspberry pi 和 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\Innermm\'+test_var+'.csv') 

我收到屏幕左侧中间带有白色十字的红色圆圈的错误,上面写着

'EOL while scanning string literal pyflakes E'

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

此外,我尝试在路径前添加 r,在路径后添加 ,'rb',但是没有用。

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

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

prelim = pd.read_csv(file_path)

参考:String and Bytes literals

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

prelim = pd.read_csv(f'C:\Users\Edwardtx\Downloads\Tomsstuff\data_pp_kvals\test2\Innermm\{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\Innermm"
# 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 连接起来,这是系统相关的。

您可以通过以下方式使用 f 字符串读取 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\Innermm\{test_var}.csv')