如何在接受用户输入的同时在pandas read_csv中读取带有转义字符的文件路径?

时间:2017-09-12 21:56:14

标签: python string pandas string-literals

我正在尝试接受用户的路径,然后在该路径中加载电子表格:

df_path = input('What is the file path?')
df = pd.read_csv(df_path, index_col=2)

有些用户在粘贴路径时会因为转义序列而被告知无效。此处,\166正在转换为v

df_path = input('What is the file path?')

C:\ Data \ 166 - data \ data.csv #entered by user

df = pd.read_csv(df_path, index_col=2)

FileNotFoundError: [Errno 2] No such file or directory: "C:\\Datav - data\\data.csv"

我知道在代码中手动加载路径,这可以解释为:

dataset = pd.read_csv(r"C:\Data\166 - data\data.csv", index_col=2)

但是,在接受用户输入将其存储为变量时,我无法找到一种方法来完成这项工作(尝试了多种尝试方法)所以,这里有一个例子):

df_path = input('What is the file path?')

" C:\ Data \ 166 - data \ data.csv" #entered by user

df = pd.read_csv("r'" + df_path, index_col=2)

OSError: [Errno 22] Invalid argument: "r'C:\\Datav - data\\data.csv"

尝试重写路径并将\替换为\\并不起作用:

df_path = df_path.replace("\", "\\")

SyntaxError: unexpected character after line continuation character

-

df_path = df_path.replace(r"\", r"\\")

SyntaxError: unexpected character after line continuation character

如何做到这一点?

3 个答案:

答案 0 :(得分:1)

您正在将\166变为v,您需要替换为\\166

它与r'\166'一起使用的原因是因为你告诉解释器从字面上理解字符串。反斜杠字面上反斜杠。

在你的工作中,你在另一个字符串的前面添加了一个字符串"r'",这就是为什么它找不到目录"r'C:/"

简而言之,"r'string'"r'string'不同,其中r在字符串引号之外。

这是原始字符串上的break down

如果你在你的第二个代码块中将r添加到字符串的前面,你应该得到一个有效的解决方案,如下所示:

df_path = r"C:\Data\166 - data\data.csv"

或者用两个反斜杠写字符串会做同样的事情:

df_path = "C:\\Data\\166 - data\\data.csv"

答案 1 :(得分:0)

现在更清楚了。 Python 3.5是版本,代码是:

df_path = input('What is the file path?')

很明显为什么在错误时使用字符串进行测试。从文字中设置df_path会产生错误,您需要一个raw_string来避免该错误。

但是输入的数据应该与raw_string相同。无需转换。 用简单的程序测试:

a= "C:\Data\166 - data\data.csv"  # the \ characters here will be mapped
b= r"C:\Data\166 - data\data.csv"  # the r means \ will not be special
c= input("? ")  # data from input is already treated like the r"\" above
print(a==c,b==c)
print(c)

使用python 3.5 Produces:

? C:\Data\166 - data\data.csv
False True
C:\Data\166 - data\data.csv
>>> 

在空闲时,或在windows&cm;'中,在powershell或bash shell中(尽管该示例显然是针对windows),结果如上所述,输入等于r"& #34;串。这表明python的正常行为是将输入完全视为原始字符串,相当于使用r''在代码中。

所以可能是你的测试中你需要用r""来模拟raw_string,这是唯一的错误。

如果你说人们得到了' v'键入字符串时,这将是不同的东西。

您是说用户输入C:\Data\166 - data\data.csv导致df_path打印为'C:\\Datav - data\\data.csv'而不是打印为'C:\\Data\\166 - data\\data.csv'的正确数据

或者只是你试图阻止这种情况发生,因为你认为会发生这种情况?

如果它确实发生了,问题不在于python本身。实际的控制台环境或正在运行程序的终端正在将自己的\ 166转换为转义字符,或者应用程序中的某些其他处理正在修改字符串。如果程序使用df_path = r'C:\Data\166 - data\data.csv'代替输入,那么它只能是输入字符串的环境,或者输入本身已从标准python输入中更改。

但是我怀疑你在尝试用字符串中的设置替换input时发现了一个错误,并试图围绕input实际上不存在的问题进行编码,只是测试数据

注意:正如@GiantsLoveDeathMetal所解释的那样,一个python' rawstring'与r''在引号之前,通过python更改程序文件本身的读取。你不能用一个' r'在字符串中重现这是如何工作的。 r在引号之外,告诉python如何读取原始字符串,这都是在程序执行之前完成的。同样的规则也适用于f'' python 3.6中的字符串。

答案 2 :(得分:0)

我在复制问题时遇到了一些困难。也许可以添加额外的一行来查看它是否有帮助?

df_path = "C:\Data\166 - data\data.csv"
file_path = str(df_path)
df = pd.read_csv(file_path, index_col=2)