您可以通过以下方式从字符串创建原始字符串:
test_file=open(r'c:\Python27\test.txt','r')
如何从字符串变量创建原始变量,例如
path = 'c:\Python27\test.txt'
test_file=open(rpath,'r')
因为我有一个文件路径:
file_path = "C:\Users\b_zz\Desktop\my_file"
当我这样做时:
data_list = open(os.path.expandvars(file_path),"r").readlines()
我明白了:
Traceback (most recent call last):
File "<pyshell#32>", line 1, in <module>
scheduled_data_list = open(os.path.expandvars(file_path),"r").readlines()
IOError: [Errno 22] invalid mode ('r') or filename: 'C:\\Users\x08_zz\\Desktop\\my_file'
答案 0 :(得分:8)
在进程中创建字符串后,没有“raw string”这样的东西。指定字符串的""
和r""
方法仅存在于源代码本身中。
这意味着"\x01"
将创建一个由一个字节0x01
组成的字符串,但r"\x01"
将创建一个由4个字节'0x5c', '0x78', '0x30', '0x31'
组成的字符串。 (假设我们正在讨论python 2并暂时忽略编码)。
你在评论中提到你正在从用户那里获取字符串(gui或console输入在这里工作相同) - 在这种情况下,字符串字符转义将不会被处理,所以你不需要做任何关于它。您可以像这样轻松地检查它(或者等效的窗口,我只说* nix):
% cat > test <<EOF
heredoc> \x41
heredoc> EOF
% < test python -c "import sys; print sys.stdin.read()"
\x41
答案 1 :(得分:2)
我将字符串转换为原始字符串的解决方案(仅适用于此序列:'\ a',\ b','\ f','\ n','\ r','\ t','\ v '。所有转义序列的列表是here):
def str_to_raw(s):
raw_map = {8:r'\b', 7:r'\a', 12:r'\f', 10:r'\n', 13:r'\r', 9:r'\t', 11:r'\v'}
return r''.join(i if ord(i) > 32 else raw_map.get(ord(i), i) for i in s)
演示:
>>> file_path = "C:\Users\b_zz\Desktop\fy_file"
>>> file_path
'C:\\Users\x08_zz\\Desktop\x0cy_file'
>>> str_to_raw(file_path)
'C:\\Users\\b_zz\\Desktop\\fy_file'
答案 2 :(得分:0)
ndpu的解决方案适合我。
我无法抗拒增强它的诱惑(使其与古老的Python 2版本兼容并希望加速它):
_dRawMap = {8:r'\b', 7:r'\a', 12:r'\f', 10:r'\n', 13:r'\r', 9:r'\t', 11:r'\v'}
def getRawGotStr(s):
#
return r''.join( [ _dRawMap.get( ord(c), c ) for c in s ] )
我做了一个仔细的时间试验,结果是ndpu的原始代码更快一点。列表推导很快,但生成器表达式更快。</ p>