[英]Python join method inserting string rather than concatenating
我正在嘗試編寫一個接收文件的方法,然后將其文件名轉換為一串隨機字符而不更改擴展名。 然而,不知何故.join()
方法通過將新字符串插入到原始字符串中而有點出人意料。
最小的可重現示例:
import string
import random
random_string = "".join(random.SystemRandom().choice(string.ascii_letters + string.digits) for _ in range(10))
extension = "IMG_4078.JPG".rsplit(".", 1)[1]
filename = random_string.join([".", extension])
print(f"Random string: {random_string}")
print(f"Extension: {extension}")
print(f"File name: {filename}")
結果:
Random string: BgjnFKrLvc
Extension: JPG
File name: .BgjnFKrLvcJPG
我期待它是BgjnFKrLvc.JPG
,我想知道我在哪里做錯了。
編輯:出於好奇,我運行timeit
模塊來比較兩個解決方案filename = f"{random_string}.{extension}"
與filename = ".".join([random_string, extension])
。 在我每跑 1M 次后,前者最終會稍微快一些(分別為 62.87387199999648 秒和 63.04620390000491 秒)。
您正在生成正確的隨機字符串,您正在獲得正確的擴展名,現在只需將它們連接為:
filename = f"{random_string}.{extension}"
f-string 的替代方案:
filename = "{}.{}".format(random_string, extension)
join()
方法通過連接由字符串分隔符分隔的可迭代對象的所有元素來返回字符串。 在random_string.join(extension)
中,您的字符串分隔符是random_string
。 這就是為什么你會得到一些奇怪的東西
import string
import random
random_string = "".join(random.SystemRandom().choice(string.ascii_letters + string.digits) for _ in range(10))
extension = "IMG_4078.JPG".rsplit(".", 1)[1]
filename = random_string.join(extension)
print(f"Random string: {random_string}")
print(f"Extension: {extension}")
print(f"File name: {filename}")
# Random string: Q1ZZbHEIdC
# Extension: JPG
# File name: JQ1ZZbHEIdCPQ1ZZbHEIdCG
為了正確實施,請使用
filename = '.'.join([random_string, extension])
join 方法的語法是違反直覺的。 從文檔:
str.join(iterable)¶ 返回一個字符串,它是 iterable 中字符串的串聯。 如果 iterable 中有任何非字符串值,包括字節對象,則會引發 TypeError。 元素之間的分隔符是提供此方法的字符串。
如果您需要多次使用相同的分隔符,或者如果您已經有想要在列表中連接的內容(例如在創建random_string
時),這很有用。
對於僅連接任意字符串,有兩種更清晰的編寫方式:
+
): filename = random_string + "." + extension
filename = random_string + "." + extension
filename = f"{random_string}.{extension}"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.