来自传递给raw_input()的文件内容副本的字符串中CR的奇怪消失

为了弄清楚似乎是一个bug的原因,我终于碰到了Python 2.7中raw_input()函数的奇怪行为: 它仅从文件内容的手动复制(通过剪贴板)产生的字符串中删除对CR LF的CR字符。传递给raw_input()的字符串是与前者相同的字符串显示的副本,它们不会丢失它们的CR字符。 在所有情况下,单独的CR字符保持不变。 CR(回车)是 r n字符。 为了比混乱的描述更清楚,这里有一个代码描述了观察事实必须做什么,其命令只需要执行。 这一点在Text对象中:它有7个字符而不是8个字符,这些字符被传递给raw_input()以创建Text。 为了验证传递给raw_input()的参数真的有8个字符,我用相同的参数创建了另一个文件PASTED.txt。在这个问题中确定一些东西确实是一个尴尬的任务,因为在Notepad ++窗口中的复制向我显示:行的各种末端( r, n, r n)在四肢处显示为CR LF在这样的窗口中的线条。 建议使用Ctrl-A选择文件的整个数据。 我很困惑,想知道我是否犯了编码或理解的错误,或者它是否是Python的真正特征。 我希望你的评论和光明。
with open('PRIM.txt','wb') as f:
    f.write('ArBnCrnD')
print "  1) A file with name 'PRIM.txt' has just been created with content A\rB\nC\r\nD"
raw_input("  Open this file and copy manually its CONTENT in the clipboard.n"+
          "    --when done, press Enter to continue-- ")


print "n  2) Paste this CONTENT in a Notepad++ window "+
      "     and see the symbols at the extremities of the lines."
raw_input("    --when done, press Enter to continue-- ")


Text = raw_input("n  3) Paste this CONTENT here and press a key : ")
print ("     An object Text has just been created with this pasted value of CONTENT.")


with open('PASTED.txt','wb') as f:
    f.write('')
print "n  4) An empty file 'PASTED.txt' has just been created."
print "     Paste manually in this file the PRIM's CONTENT and shut this file."
raw_input("     --when done, press Enter to continue-- ")


print "n  5) Enter the copy of this display of A\rB\nC\r\nD : nArBnCrnD"
DSP = raw_input('please, enter it on the following line :n')
print "    An object DSP has just been created with this pasted value of this copied display"


print 'n----------'
with open('PRIM.txt','rb') as fv:
    verif = fv.read()
print "The read content of the file 'PRIM.txt' obtained by open() and read() : "+repr(verif)
print "len of the read content of the file 'PRIM.txt'  ==",len(verif)


print 'n----------'
print "The file PASTED.txt received by pasting the manually copied CONTENT of PRIM.txt"
with open('PASTED.txt','rb') as f:
    cpd = f.read()
    print "The read content of the file 'PASTED.txt' obtained by open() and read() "+
          "is now : "+repr(cpd)
    print "its len is==",len(cpd)


print 'n----------'
print 'The object Text received through raw_input() the manually copied CONTENT of PRIM.txt'
print "value of Text=="+repr(Text)+
      "nText.split('\r\n')==",Text.split('rn')
print 'len of Text==',len(Text)


print 'n----------'
print "The object DSP received  through raw_input() the copy of the display of A\rB\nC\r\nD" 
print "value of DSP==",repr(DSP)
print 'len of DSP==',len(DSP)
我的操作系统是Windows。我想知道在其他操作系统上是否也观察到相同的情况。     
已邀请:
sys.stdin
在文本模式下打开(您可以通过显示
sys.stdin.mode
并查看它是
'r'
来检查)。如果在Python中以文本模式打开任何文件,则平台本机行结尾(Windows为
rn
)将在Python字符串中转换为简单换行符(
n
)。 您可以通过使用模式
'r'
而不是
'rb'
打开
PASTED.txt
文件来查看此操作。     
在我的帖子之后,我可以从我的代码中查找,我确实注意到从文件复制并传递给raw_input()的数据修改与Python在文件中直接读取数据时执行的换行修改相同,这在这里得到证明:
with open("TestWindows.txt", 'wb') as f:
    f.write("PACIFIC r  ARCTIC n  ATLANTIC rn  ")

print "n- Following string have been written in TestWindows.txt in mode 'wb' :n"+
      "PACIFIC \r  ARCTIC \n  ATLANTIC \r\n  "


print "n- data got by reading the file TestWindows.txt in 'rb' mode :"
with open("TestWindows.txt", 'rb') as f:
    print "    repr(data)==",repr(f.read())

print "n- data got by reading the file TestWindows.txt in 'r' mode :"
with open("TestWindows.txt", 'r') as f:
    print "    repr(data)==",repr(f.read())

print "n- data got by reading the file TestWindows.txt in 'rU' mode :"
with open("TestWindows.txt", 'rU') as f:
    print "    repr(data)==",repr(f.read())
结果:
- Following string have been written in TestWindows.txt in mode 'wb' :
PACIFIC r  ARCTIC n  ATLANTIC rn  

- data got by reading the file TestWindows.txt in 'rb' mode :
    repr(data)== 'PACIFIC r  ARCTIC n  ATLANTIC rn  '

- data got by reading the file TestWindows.txt in 'r' mode :
    repr(data)== 'PACIFIC r  ARCTIC n  ATLANTIC n  '

- data got by reading the file TestWindows.txt in 'rU' mode :
    repr(data)== 'PACIFIC n  ARCTIC n  ATLANTIC n  '
首先,文件PASTED.txt与文件PRIM.txt具有相同的内容,这是因为复制PRIM.txt的内容并将其粘贴到PASTED.txt中而不转换为Python字符串。因此,当数据从文件转移到另一个仅由剪贴板传输的文件时,它不会被修改。这一事实证明PRIM.txt的内容在复制放置数据的剪贴板中没有损坏。 其次,修改了通过剪贴板和raw_input()从文件到Python字符串的数据;因此修改发生在剪贴板和Python字符串之间。所以我认为raw_input()可能对从剪贴板接收的数据做出与Python解释器从文件读取中接收数据时相同的解释。 然后,我认为用 n替换 r n的想法是因为“Windows性质”的数据变成了“Python性质”的数据并且剪贴板没有引入修改数据,因为它是Windows操作系统控制的一部分。 唉,事实上,从屏幕复制并传递给raw_input()的数据不会进行换行 r n的转换,尽管这些数据通过Windows的剪贴板传输,这打破了我的小概念。 然后我认为Python知道数据的性质不是因为它的来源,而是因为数据中包含的信息;这些信息是'格式'。我找到了关于Windows剪贴板的以下页面,确实有几种格式的剪贴板记录的信息: http://msdn.microsoft.com/en-us/library/ms648709(v=vs.85).aspx 也许,Python修改 r n的解释与剪贴板中存在的这些格式有关,也许不是。但我不太了解所有这些混乱,我很清楚。 有人能够解释上述所有观察结果吗? 。 。 谢谢你的回答,ncoghlan。但我不认为这是原因: sys.stdin没有属性模式 sys.stdin指的是键盘,据我所知。但是,在我的代码中,数据不是来自键盘上的键入,而是来自通过剪贴板的粘贴。这不一样。 关键点在于我不明白Python插件如何区分来自剪贴板的数据已从文件中复制而来自剪贴板的数据已从屏幕复制     

要回复问题请先登录注册