Combine f-string and raw string literal
Question:
I’m wondering how to use an f-string whilst using r
to get a raw string literal. I currently have it as below but would like the option of allowing any name to replace Alex
I was thinking adding an f-string and then replacing Alex
with curly braces and putting username inside but this doesn’t work with the r
.
username = input('Enter name')
download_folder = r'C:UsersAlexDownloads'
Answers:
Alternatively, you could use the str.format()
method.
name = input("What is your name? ")
print(r"C:Users{name}Downloads".format(name=name))
This will format the raw string by inserting the name
value.
You can combine the f
for an f-string with the r
for a raw string:
user = 'Alex'
dirToSee = fr'C:Users{user}Downloads'
print (dirToSee) # prints C:UsersAlexDownloads
The r
only disables backslash escape sequence processing, not f-string processing.
Quoting the docs:
The ‘f’ may be combined with ‘r’, but not with ‘b’ or ‘u’, therefore raw formatted strings are possible, but formatted bytes literals are not.
…
Unless an ‘r’ or ‘R’ prefix is present, escape sequences in string and bytes literals are interpreted…
Since you are working with file paths, I would avoid f-strings and rather use a library geared for path manipulation. For example pathlib
would allow you to do:
from pathlib import Path
username = input('Enter name')
download_folder = Path('C:/Users', username, 'Downloads')
This approach also offers some other common file operations such as, such as is_dir
open
.
Alternatively you could also use os.path.join
)
As others have mentioned, it’s indeed possible to mix r
and f
.
Be careful, though, since the interpolated strings will not be raw by default:
not_escaped = "not_escaped"
half_escaped = rf"escaped_{not_escaped}"
print(half_escaped)
### outputs:
# escaped_
# ot_escaped
You’d have to use r
for the interpolated strings too:
escaped = r"n_escaped"
full_escaped = rf"escaped_too_{escaped}"
print(full_escaped)
# escaped_too_n_escaped
The simplest way I’ve found of doing this is to use implicit line continuation to split my strings up into component parts, i.e. separate out ‘r’ and ‘f’ strings inside parenthases. Here’s an example matplotlib title with ‘normal’, ‘formatted’, and ‘raw’ string literals (read more here):
plt.title('Blind Surveys 01-FEB-2022n'
f'Recording{n}; Mean dose rate: {m.get_mean_doserate()*1000:.4f}'
r' $mathrm{mu}$Sv/hr', fontsize='x-large')
Just to make it more applicable to the question, you can also use implicit line continuation in variable declaration:
user = ‘Alex’
dir_out = (r‘C:Users’
f‘{user}’
r‘Downloads’)
print(dir_out) #C:UsersAlexDownloads
Admittedly this seems a bit overkill for this simple scenario but will be your friend when strings become more complex!
you can try:
username = input('Enter name')
download_folder = r'C:UsersAlexDownloads'
download_folder = download_folder.replace("Alex", username)
print(download_folder)
I’m wondering how to use an f-string whilst using r
to get a raw string literal. I currently have it as below but would like the option of allowing any name to replace Alex
I was thinking adding an f-string and then replacing Alex
with curly braces and putting username inside but this doesn’t work with the r
.
username = input('Enter name')
download_folder = r'C:UsersAlexDownloads'
Alternatively, you could use the str.format()
method.
name = input("What is your name? ")
print(r"C:Users{name}Downloads".format(name=name))
This will format the raw string by inserting the name
value.
You can combine the f
for an f-string with the r
for a raw string:
user = 'Alex'
dirToSee = fr'C:Users{user}Downloads'
print (dirToSee) # prints C:UsersAlexDownloads
The r
only disables backslash escape sequence processing, not f-string processing.
Quoting the docs:
The ‘f’ may be combined with ‘r’, but not with ‘b’ or ‘u’, therefore raw formatted strings are possible, but formatted bytes literals are not.
…
Unless an ‘r’ or ‘R’ prefix is present, escape sequences in string and bytes literals are interpreted…
Since you are working with file paths, I would avoid f-strings and rather use a library geared for path manipulation. For example pathlib
would allow you to do:
from pathlib import Path
username = input('Enter name')
download_folder = Path('C:/Users', username, 'Downloads')
This approach also offers some other common file operations such as, such as is_dir
open
.
Alternatively you could also use os.path.join
)
As others have mentioned, it’s indeed possible to mix r
and f
.
Be careful, though, since the interpolated strings will not be raw by default:
not_escaped = "not_escaped"
half_escaped = rf"escaped_{not_escaped}"
print(half_escaped)
### outputs:
# escaped_
# ot_escaped
You’d have to use r
for the interpolated strings too:
escaped = r"n_escaped"
full_escaped = rf"escaped_too_{escaped}"
print(full_escaped)
# escaped_too_n_escaped
The simplest way I’ve found of doing this is to use implicit line continuation to split my strings up into component parts, i.e. separate out ‘r’ and ‘f’ strings inside parenthases. Here’s an example matplotlib title with ‘normal’, ‘formatted’, and ‘raw’ string literals (read more here):
plt.title('Blind Surveys 01-FEB-2022n'
f'Recording{n}; Mean dose rate: {m.get_mean_doserate()*1000:.4f}'
r' $mathrm{mu}$Sv/hr', fontsize='x-large')
Just to make it more applicable to the question, you can also use implicit line continuation in variable declaration:
user = ‘Alex’
dir_out = (r‘C:Users’
f‘{user}’
r‘Downloads’)
print(dir_out) #C:UsersAlexDownloads
Admittedly this seems a bit overkill for this simple scenario but will be your friend when strings become more complex!
you can try:
username = input('Enter name')
download_folder = r'C:UsersAlexDownloads'
download_folder = download_folder.replace("Alex", username)
print(download_folder)