[譯]The Python Tutorial#Input and Output

[譯]The Python Tutorial#Input and Output

Python中有多種展示程序輸出的方式幕帆;數(shù)據(jù)可以以人類(lèi)可讀的方式打印出來(lái),也可以輸出到文件中以后使用承匣。本章節(jié)將會(huì)詳細(xì)討論。

7.1 Fancier Output Formatting

目前為止已經(jīng)介紹過(guò)兩種輸出值的方式:表達(dá)式語(yǔ)句print()函數(shù)飘言。(第三種方式是使用對(duì)象的write()方法斗忌;使用sys.stdout引用標(biāo)準(zhǔn)輸出文件能犯。詳細(xì)信息參考庫(kù)文件參考手冊(cè)。)

有時(shí)候需要對(duì)輸出有更多的控制沈贝,而不是簡(jiǎn)單的使用空格分開(kāi)值杠人。有兩種方式格式化輸出:第一種方式是手動(dòng)處理字符串,使用字符串的切片和連接操作宋下,創(chuàng)建任何可以想象到的輸出布局嗡善。字符串類(lèi)型提供了一些將字符串填充到指定列寬的有用方法,馬上會(huì)討論這點(diǎn)学歧。第二種方式是使用格式化字符串或者str.format()方法罩引。

string模塊包含Template類(lèi),該類(lèi)提供向字符串代入值的方法枝笨。

當(dāng)然還有一個(gè)問(wèn)題:如何將值轉(zhuǎn)換為字符串蜒程?Python提供了將任何值轉(zhuǎn)換為字符串的方法:將值傳遞給repr()或者str()函數(shù)即可。

str()函數(shù)返回值的人類(lèi)可讀的形式伺帘,而repr()生成值的解釋器可讀形式(如果沒(méi)有等價(jià)語(yǔ)法昭躺,將會(huì)強(qiáng)制拋出SyntaxError)。對(duì)于沒(méi)有提供特定適應(yīng)人類(lèi)閱讀形式的對(duì)象伪嫁,str()函數(shù)會(huì)返回與repr()相同的值领炫。許多值使用str()repr()函數(shù)將得到相同的返回值,如數(shù)字或者像列表和字典的結(jié)構(gòu)體张咳。特別地帝洪,字符串有兩種區(qū)別明顯的表示形式。

以下是一些示例:

>>> s = 'Hello, world.'
>>> str(s)
'Hello, world.'
>>> repr(s)
"'Hello, world.'"
>>> str(1/7)
'0.14285714285714285'
>>> x = 10 * 3.25
>>> y = 200 * 200
>>> s = 'The value of x is ' + repr(x) + ', and y is ' + repr(y) + '...'
>>> print(s)
The value of x is 32.5, and y is 40000...
>>> # The repr() of a string adds string quotes and backslashes:
... hello = 'hello, world\n'
>>> hellos = repr(hello)
>>> print(hellos)
'hello, world\n'
>>> # The argument to repr() may be any Python object:
... repr((x, y, ('spam', 'eggs')))
"(32.5, 40000, ('spam', 'eggs'))"

有兩種方式輸出一個(gè)平方和立方表格:

>>> for x in range(1, 11):
...     print(repr(x).rjust(2), repr(x*x).rjust(3), end=' ')
...     # Note use of 'end' on previous line
...     print(repr(x*x*x).rjust(4))
...
 1   1    1
 2   4    8
 3   9   27
 4  16   64
 5  25  125
 6  36  216
 7  49  343
 8  64  512
 9  81  729
10 100 1000

>>> for x in range(1, 11):
...     print('{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x))
...
 1   1    1
 2   4    8
 3   9   27
 4  16   64
 5  25  125
 6  36  216
 7  49  343
 8  64  512
 9  81  729
10 100 1000

(第一個(gè)例子中脚猾,列之間的那個(gè)空格是由print()自動(dòng)添加的:該函數(shù)在輸出時(shí)總是在參數(shù)之間插入空格)

這個(gè)例子演示了string對(duì)象的str.rjust()方法葱峡,這個(gè)方法使字符串在給定寬度的列中向右對(duì)齊,在左邊添加空格龙助。str.ljust()str.center()是相似的方法砰奕。這些方法并不會(huì)改變?cè)瓉?lái)的字符串,只是返回一個(gè)新的字符串提鸟。如果輸入的字符串太長(zhǎng)军援,這些方法并不會(huì)截?cái)嘧址遣桓淖冏址⒎祷爻蒲浑m然這樣會(huì)使得列布局混亂胸哥,但是總比輸出不真實(shí)的值好。(若實(shí)在想截?cái)嗫梢允褂们衅僮魃南剩纾?code>x.ljust(n)[:n]空厌。)

方法str.zfill()在數(shù)字字符串左側(cè)添加零庐船,可以識(shí)別正負(fù)號(hào):

>>> '12'.zfill(5)
'00012'
>>> '-3.14'.zfill(7)
'-003.14'
>>> '3.14159265359'.zfill(5)
'3.14159265359'

str.format()的基礎(chǔ)使用方式是:

>>> print('We are the {} who say "{}!"'.format('knights', 'Ni'))
We are the knights who say "Ni!"

傳入str.format()中的對(duì)象會(huì)替換掉花括號(hào)和其中的字符(稱(chēng)作格式化域)〕案花括號(hào)中的數(shù)字可以用來(lái)匹配傳入str.format()的對(duì)象列表相應(yīng)位置的對(duì)象醉鳖。

>>> print('{0} and {1}'.format('spam', 'eggs'))
spam and eggs
>>> print('{1} and {0}'.format('spam', 'eggs'))
eggs and spam

str.format()中可以使用關(guān)鍵字參數(shù),使用參數(shù)名引用對(duì)應(yīng)的值:

>>> print('This {food} is {adjective}.'.format(
...       food='spam', adjective='absolutely horrible'))
This spam is absolutely horrible.

可以結(jié)合位置參數(shù)和關(guān)鍵字參數(shù):

>>> print('The story of {0}, {1}, and {other}.'.format('Bill', 'Manfred',
                                                       other='Georg'))
The story of Bill, Manfred, and Georg.

!a(對(duì)應(yīng)ascii())哮内,!s(對(duì)應(yīng)str())以及!r(對(duì)應(yīng)repr())盗棵,用于在格式化之前轉(zhuǎn)換值:

>>> contents = 'eels'
>>> print('My hovercraft is full of {}.'.format(contents))
My hovercraft is full of eels.
>>> print('My hovercraft is full of {!r}.'.format(contents))
My hovercraft is full of 'eels'.

在格式化域后可以跟可選的:以及格式化命令,允許對(duì)值的格式化進(jìn)一步控制北发。以下示例指定PI的精度為3位:

>>> import math
>>> print('The value of PI is approximately {0:.3f}.'.format(math.pi))
The value of PI is approximately 3.142.

:后跟一個(gè)整數(shù)可以指定格式化域的最小寬度纹因。在制作表格時(shí)這很有用:

>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678}
>>> for name, phone in table.items():
...     print('{0:10} ==> {1:10d}'.format(name, phone))
...
Jack       ==>       4098
Dcab       ==>       7678
Sjoerd     ==>       4127

如果有一個(gè)長(zhǎng)的字符串并不想做分離,可以使用名字而不是位置來(lái)引用變量琳拨。簡(jiǎn)單的傳遞一個(gè)字典瞭恰,并且使用中括號(hào)來(lái)訪問(wèn)鍵:

>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
>>> print('Jack: {0[Jack]:d}; Sjoerd: {0[Sjoerd]:d}; '
...       'Dcab: {0[Dcab]:d}'.format(table))
Jack: 4098; Sjoerd: 4127; Dcab: 863767

也可以使用**將字典拆包為關(guān)鍵字參數(shù):

>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
>>> print('Jack: {Jack:d}; Sjoerd: {Sjoerd:d}; Dcab: {Dcab:d}'.format(**table))
Jack: 4098; Sjoerd: 4127; Dcab: 8637678

built-in函數(shù)vars()返回將當(dāng)前局部變量作為字典返回,結(jié)合vars()使用時(shí)狱庇,以上特別有用惊畏。

參考Format String Syntax,完全了解str.format()密任。

7.1.1 Old string formatting

可以使用%操作符格式化字符串颜启。這種方式像sprintf()風(fēng)格一樣解析%左邊的格式化參數(shù),并將右邊的參數(shù)應(yīng)用到左邊浪讳,然后返回格式化后的字符串缰盏。示例:

>>> import math
>>> print('The value of PI is approximately %5.3f.' % math.pi)
The value of PI is approximately 3.142.

更多信息參見(jiàn)printf-style String Formatting 章節(jié)。

7.2 Reading and Writing Files

open()函數(shù)返回文件對(duì)象(file object)淹遵,通常使用兩個(gè)參數(shù)調(diào)用:open(filename, mode)口猜。

>>> f = open('workfile', 'w')

第一個(gè)參數(shù)是文件的字符串路徑。第二個(gè)參數(shù)是包含幾個(gè)字符的字符串透揣,描述文件的使用方式济炎。模式r用于讀;w只用于寫(xiě)(存在的同名文件將會(huì)被刪除)辐真;a打開(kāi)文件追加內(nèi)容须尚,所有寫(xiě)到文件中的內(nèi)容都會(huì)自動(dòng)添加到文件末尾;r+打開(kāi)文件可讀可寫(xiě)拆祈。模式參數(shù)是可選的恨闪,r是默認(rèn)模式參數(shù)倘感。

通常放坏,文件以文本模式打開(kāi),意味著可以從文件中讀寫(xiě)字符串老玛,字符串以特定的格式編碼淤年。如果沒(méi)有指定字符編碼钧敞,那默認(rèn)值是平臺(tái)相關(guān)的編碼(參見(jiàn)open())。追加到模式參數(shù)的b指定文件以二進(jìn)制模式打開(kāi):數(shù)據(jù)以字節(jié)對(duì)象的形式讀寫(xiě)麸粮。這種模式用于不包含文本的文件溉苛。

文本模式中,讀文件時(shí)默認(rèn)將平臺(tái)特定的行尾結(jié)束符(Unix中的\n弄诲,Windows中的\r\n)轉(zhuǎn)換為\n愚战。以文本模式寫(xiě)文件時(shí),默認(rèn)將所有出現(xiàn)的\n轉(zhuǎn)換為平臺(tái)特定的行尾結(jié)束符齐遵。這種暗地修改文件數(shù)據(jù)對(duì)于文本文件沒(méi)有影響寂玲,但是會(huì)損壞JPEG或者EXE之類(lèi)的文件的數(shù)據(jù)。使用二進(jìn)制模式讀寫(xiě)這類(lèi)文件是要謹(jǐn)慎梗摇。

處理文件對(duì)象時(shí)使用with是比較好的實(shí)踐拓哟。好處是當(dāng)操作完成后文件可以恰當(dāng)關(guān)閉,即使有異常發(fā)生伶授。使用with比使用與其等價(jià)的try-finally語(yǔ)句塊也簡(jiǎn)潔得多:

>>> with open('workfile') as f:
...     read_data = f.read()
>>> f.closed
True

如果沒(méi)有使用with關(guān)鍵字断序,必須手動(dòng)調(diào)用f.close()方法關(guān)閉文件,立即釋放占用的系統(tǒng)資源糜烹。如果沒(méi)有明確關(guān)閉文件违诗,Python的垃圾收集程序最終會(huì)銷(xiāo)毀對(duì)象并關(guān)閉文件,但是這之前文件會(huì)保持打開(kāi)狀態(tài)一段時(shí)間疮蹦。另一個(gè)風(fēng)險(xiǎn)是不同的Python解釋器實(shí)現(xiàn)會(huì)在不同的時(shí)刻做回收操作较雕。

文件對(duì)象關(guān)閉后,無(wú)論通過(guò)with語(yǔ)句還是使用f.close()試圖使用文件對(duì)象都會(huì)失斨勘摇:

>>> f.close()
>>> f.read()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: I/O operation on closed file

7.2.1 Methods of File Objects

這個(gè)章節(jié)以下的示例中亮蒋,假設(shè)已經(jīng)創(chuàng)建了一個(gè)叫做f的文件對(duì)象。

使用f.read(size)讀取文件內(nèi)容妆毕,該方法讀取指定數(shù)量數(shù)據(jù)并作為字符串(文本模式)或者字節(jié)對(duì)象(二進(jìn)制模式)返回慎玖。size是可選的數(shù)字參數(shù)。size省略或者為負(fù)數(shù)時(shí)笛粘,會(huì)讀取整個(gè)文件內(nèi)容并且返回趁怔,如果文件大小比機(jī)器內(nèi)存要大時(shí),全部讀取會(huì)產(chǎn)生問(wèn)題薪前。若指定size润努,至多size大小的字節(jié)被讀取并返回。如果讀到了文件末尾示括,f.read()返回空字符串('')铺浇。

>>> f.read()
'This is the entire file.\n'
>>> f.read()
''

f.readline()從文件中讀取單行,讀取到的字符串末尾會(huì)自動(dòng)加上換行符(\n)垛膝,只有當(dāng)文件不以換行符結(jié)尾時(shí)鳍侣,讀取到文件的最后一行才不會(huì)自動(dòng)加'\n'丁稀。這樣使得返回值不會(huì)含糊不清,如果f.readline()返回空字符串時(shí)倚聚,那么就讀到了文件末尾线衫,而空行則返回\n表示,這是一個(gè)只包含單個(gè)換行符的字符串惑折。

>>> f.readline()
'This is the first line of the file.\n'
>>> f.readline()
'Second line of the file\n'
>>> f.readline()
''

使用迭代文件對(duì)象的方式授账,從文件中讀取行。這種方式內(nèi)存高效惨驶,快速矗积,代碼簡(jiǎn)潔:

>>> for line in f:
...     print(line, end='')
...
This is the first line of the file.
Second line of the file

如果需要讀取文件所有行到列表中,可以使用list(f)或者f.readlines()敞咧。

f.write(string)將內(nèi)容string寫(xiě)入文件棘捣,返回寫(xiě)入的字符串?dāng)?shù)。

>>> f.write('This is a test\n')
15

其他類(lèi)型的對(duì)象在寫(xiě)入之前對(duì)象需要轉(zhuǎn)換休建,要么轉(zhuǎn)換為字符串(文本模式)乍恐,要么轉(zhuǎn)換為字節(jié)對(duì)象(二進(jìn)制模式):

>>> value = ('the answer', 42)
>>> s = str(value)  # convert the tuple to string
>>> f.write(s)
18

在二進(jìn)制模式中,f.tell()方法返回一個(gè)數(shù)字测砂,該數(shù)字指示文件對(duì)象在文件中的當(dāng)前位置茵烈,是相對(duì)于文件開(kāi)始的字節(jié)數(shù)目。在文本模式中砌些,該方法返回一個(gè)模糊的數(shù)字呜投。

使用f.seek(offset, from_what)改變文件對(duì)象的位置。offset(偏移量)加上from_what參數(shù)指定的參考點(diǎn)計(jì)算出要移動(dòng)到的位置存璃。from_what值為0時(shí)表示文件開(kāi)頭為參考點(diǎn)仑荐,1表示當(dāng)前文件位置為參考點(diǎn),2表示文件末尾為參考點(diǎn)纵东。from_what可以省略粘招,默認(rèn)為0,指示文件開(kāi)頭為參考點(diǎn)偎球。

>>> f = open('workfile', 'rb+')
>>> f.write(b'0123456789abcdef')
16
>>> f.seek(5)      # Go to the 6th byte in the file
5
>>> f.read(1)
b'5'
>>> f.seek(-3, 2)  # Go to the 3rd byte before the end
13
>>> f.read(1)
b'd'

文本文件中(沒(méi)有使用b洒扎,以文本模式打開(kāi)),只允許使用相對(duì)于文件開(kāi)頭的seek()方法(使用seek(0, 2)尋找文件末尾例外)衰絮,并且有效的offset值(偏移量)只能是f.tell()的返回值或者0袍冷。任何其他的offset值(偏移量)都會(huì)發(fā)生未定義的行為。

文件對(duì)象有一些額外的方法猫牡,比如很少使用的isatty()truncate()胡诗。查閱庫(kù)文件手冊(cè)獲取關(guān)于文件對(duì)象的完整信息。

7.2.2 Saving structured data with json

字符串可以很容易從文件中讀取或?qū)懭氲轿募小S捎?code>read()方法只返回字符串乃戈,數(shù)字需要額外轉(zhuǎn)換褂痰,使用如int()的函數(shù)亩进,輸入字符串'123'返回?cái)?shù)字值123症虑。當(dāng)希望保存更為復(fù)雜的數(shù)據(jù)類(lèi)型,像嵌套列表或者字典之類(lèi)的归薛,手動(dòng)解析和序列化就變得復(fù)雜了谍憔。

不需要用戶(hù)不斷編寫(xiě)和調(diào)試保存復(fù)雜數(shù)據(jù)類(lèi)型到文件的代碼,Python提供了流行的數(shù)據(jù)交換格式JSON(JavaScript Object Notation)主籍。標(biāo)準(zhǔn)模塊json可以接收Python數(shù)據(jù)結(jié)構(gòu)习贫,并把它們轉(zhuǎn)換為字符串表示形式,這個(gè)過(guò)程稱(chēng)為序列化千元。從字符串形式重新構(gòu)造數(shù)據(jù)稱(chēng)為反序列化苫昌。在序列化合反序列換之間,字符串形式表示的對(duì)象可以存儲(chǔ)到文件或者數(shù)據(jù)中幸海,或者通過(guò)網(wǎng)絡(luò)連接發(fā)送到遠(yuǎn)程目標(biāo)機(jī)器祟身。

注解:JSON格式普遍用于現(xiàn)代應(yīng)用程序中,用于數(shù)據(jù)交換物独。許多程序員已經(jīng)熟悉了袜硫,是一種不錯(cuò)的協(xié)作選擇

可以使用以下代碼查看對(duì)象x的JSON字符串表示形式:

>>> import json
>>> json.dumps([1, 'simple', 'list'])
'[1, "simple", "list"]'

另一種dumps()方法的變種,dump()挡篓,該方法簡(jiǎn)單將對(duì)象序列化到文本文件婉陷。如果f是已經(jīng)以寫(xiě)模式打開(kāi)的文本文件對(duì)象,可以使用如下代碼:

json.dump(x, f)

可以再次解碼對(duì)象官研,如果f是以讀模式打開(kāi)的文本文件對(duì)象:

x = json.load(f)

以上是可以處理列表和字典的簡(jiǎn)單序列化技術(shù)秽澳,但是要處理任意類(lèi)實(shí)例需要額外的操作。json模塊的參考內(nèi)容包含以下解釋?zhuān)?/p>

參見(jiàn):pickle - pickle模塊

JSON不同戏羽,pickle是一種協(xié)議肝集,允許任意復(fù)雜Python對(duì)象序列化。就這一點(diǎn)論蛛壳,它只能用于 Python杏瞻, 而不能用于與其他語(yǔ)言編寫(xiě)的應(yīng)用程序通信。默認(rèn)情況下它是不安全的:如果數(shù)據(jù)由熟練的攻擊者精心制作衙荐, 反序列化來(lái)自一個(gè)不受信任源的 pickle 數(shù)據(jù)可以執(zhí)行任意代碼捞挥。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市忧吟,隨后出現(xiàn)的幾起案子砌函,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讹俊,死亡現(xiàn)場(chǎng)離奇詭異垦沉,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)仍劈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)厕倍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人贩疙,你說(shuō)我怎么就攤上這事讹弯。” “怎么了这溅?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵组民,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我悲靴,道長(zhǎng)臭胜,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任癞尚,我火速辦了婚禮耸三,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘否纬。我一直安慰自己吕晌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布临燃。 她就那樣靜靜地躺著睛驳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪膜廊。 梳的紋絲不亂的頭發(fā)上乏沸,一...
    開(kāi)封第一講書(shū)人閱讀 50,050評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音爪瓜,去河邊找鬼蹬跃。 笑死,一個(gè)胖子當(dāng)著我的面吹牛铆铆,可吹牛的內(nèi)容都是我干的蝶缀。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼薄货,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼翁都!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起谅猾,我...
    開(kāi)封第一講書(shū)人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤柄慰,失蹤者是張志新(化名)和其女友劉穎鳍悠,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體坐搔,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡藏研,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了概行。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蠢挡。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖占锯,靈堂內(nèi)的尸體忽然破棺而出袒哥,到底是詐尸還是另有隱情缩筛,我是刑警寧澤消略,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站瞎抛,受9級(jí)特大地震影響艺演,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜桐臊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一胎撤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧断凶,春花似錦伤提、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至却嗡,卻和暖如春舶沛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背窗价。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工如庭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人撼港。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓坪它,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親帝牡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子往毡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容