Sunday 2 July 2017

Valueerror unbuffered ลำธาร ต้อง เป็น ไบนารี ตัวเลือก


7. อินพุตและเอาต์พุตมีหลายวิธีที่จะนำเสนอผลลัพธ์ของข้อมูลโปรแกรมสามารถพิมพ์ในรูปแบบที่มนุษย์สามารถอ่านได้หรือเขียนลงในไฟล์เพื่อใช้ในอนาคต บทนี้จะกล่าวถึงความเป็นไปได้บางอย่าง 7.1 การจัดรูปแบบผลลัพธ์ Fancier จนถึงตอนนี้เราพบกับสองวิธีในการเขียนค่า: statement statement และ print statement (วิธีที่สามคือการใช้วิธี write () ของอ็อบเจ็กต์ไฟล์ไฟล์เอาต์พุตมาตรฐานสามารถถูกอ้างถึงเป็น sys. stdout ดูข้อมูลอ้างอิงเกี่ยวกับ Library Reference สำหรับข้อมูลเพิ่มเติม) บ่อยครั้งที่คุณต้องการควบคุมรูปแบบการแสดงผลของคุณมากกว่าเพียงแค่ ค่าที่คั่นด้วยพื้นที่พิมพ์ มีสองวิธีในการจัดรูปแบบเอาท์พุทของคุณวิธีแรกคือการทำสตริงทั้งหมดด้วยตัวเองโดยใช้การตัดสตริงและการดำเนินการแบ่งส่วนซึ่งคุณสามารถสร้างโครงร่างที่สามารถจินตนาการได้ ประเภทสตริงมีวิธีการบางอย่างที่ใช้ในการดำเนินการที่เป็นประโยชน์สำหรับการเบาะ padding เพื่อความกว้างคอลัมน์ที่กำหนดเหล่านี้จะมีการกล่าวถึงในไม่ช้า วิธีที่สองคือการใช้วิธี str. format () โมดูลสตริงประกอบด้วยชั้นเทมเพลตซึ่งมีวิธีอื่นในการเปลี่ยนค่าเป็นสตริง คำถามหนึ่งคงยังคงแน่นอนว่า: คุณแปลงค่าเป็นสตริงอย่างไรโชคดี Python มีวิธีการแปลงค่าใด ๆ ให้เป็นสตริง: ส่งผ่านไปยังฟังก์ชัน repr () หรือ str () ฟังก์ชัน str () หมายถึงการแสดงค่าที่อ่านได้อย่างเป็นธรรมในขณะที่ repr () หมายถึงการสร้างตัวแทนซึ่งสามารถอ่านได้โดยล่าม (หรือจะบังคับ SyntaxError หากไม่มีไวยากรณ์เทียบเท่า) สำหรับวัตถุที่ don8217t มีการแสดงเฉพาะสำหรับการบริโภคของมนุษย์ str () จะคืนค่าเดียวกับ repr () ค่าหลายค่าเช่นหมายเลขหรือโครงสร้างเช่นรายการและพจนานุกรมมีการใช้ฟังก์ชันเดียวกันแทน สตริงและตัวเลขจุดลอยโดยเฉพาะอย่างยิ่งมีสองตัวแทนที่แตกต่างกัน ต่อไปนี้เป็นสองวิธีในการเขียนตารางสี่เหลี่ยมจัตุรัสและสี่เหลี่ยม (โปรดสังเกตว่าในตัวอย่างแรกช่องว่างระหว่างแต่ละคอลัมน์ถูกเพิ่มโดยวิธีการพิมพ์: จะเพิ่มช่องว่างระหว่างอาร์กิวเมนต์เสมอ) ตัวอย่างนี้แสดงให้เห็นถึงการใช้งาน STR. Rjust () ของวัตถุสตริงซึ่งจะทำให้สตริงถูกต้องในฟิลด์ที่มีความกว้างโดยการเว้นช่องว่างไว้ทางด้านซ้าย มีวิธีการที่คล้ายกัน str. ljust () และ str. center () วิธีการเหล่านี้ไม่ได้เขียนอะไรพวกเขาเพียงแค่ส่งกลับสตริงใหม่ หากสตริงอินพุทยาวเกินไปพวกเขาจะตัดมันออก แต่กลับไม่ได้เปลี่ยนค่านี้จะทำให้คอลัมน์ของคุณเลอะเลือนออกไป แต่ that8217s มักจะดีกว่าทางเลือกอื่นซึ่งจะเป็นการโกหกเกี่ยวกับค่า (ถ้าคุณต้องการตัดทอนจริงๆคุณสามารถเพิ่มการดำเนินการของชิ้นส่วนได้เช่นเดียวกับใน x. ljust (n): n) มีวิธีอื่นคือ str. zfill () ซึ่งจะใส่สตริงตัวเลขทางด้านซ้ายให้กับศูนย์ เข้าใจเกี่ยวกับเครื่องหมายบวกและลบ: การใช้พื้นฐานของเมธอด str. format () จะมีลักษณะดังนี้วงเล็บและอักขระภายใน (เรียกว่าฟอร์แมตฟอร์แมต) จะถูกแทนที่ด้วยอ็อบเจ็กต์ที่ส่งเข้ามาในเมธอด str. format () จำนวนในวงเล็บหมายถึงตำแหน่งของวัตถุที่ส่งเข้ามาในวิธี str. format () ถ้าอาร์กิวเมนต์คำหลักถูกใช้ในเมธอด str. format () ค่าของพวกเขาจะถูกอ้างถึงโดยใช้ชื่อของอาร์กิวเมนต์ อาร์กิวเมนต์ตำแหน่งและคำหลักสามารถรวมกันโดยพลการ: 7.2. การอ่านและการเขียนไฟล์ open () ส่งคืนออบเจ็กต์ไฟล์และใช้กันมากที่สุดโดยมีอาร์กิวเมนต์สองแบบคือ open (filename, mode) อาร์กิวเมนต์แรกคือสตริงที่มีชื่อไฟล์ อาร์กิวเมนต์ที่สองเป็นสตริงที่มีอักขระสองสามตัวที่อธิบายถึงวิธีการใช้ไฟล์ โหมดสามารถเป็น r ได้เมื่ออ่านไฟล์ได้เฉพาะ w เท่านั้นสำหรับการเขียน (ไฟล์ที่มีอยู่ซึ่งมีชื่อเดียวกันจะถูกลบ) และจะเปิดไฟล์สำหรับผนวกข้อมูลใด ๆ ที่เขียนขึ้นในไฟล์โดยอัตโนมัติจนจบ r เปิดไฟล์สำหรับทั้งการอ่านและเขียน อาร์กิวเมนต์โหมดเป็นตัวเลือก r จะถูกสันนิษฐานหาก it8217s ถูกละไว้ ใน Windows b ต่อท้ายโหมดจะเปิดไฟล์ในโหมดไบนารีดังนั้นจึงมีโหมดเช่น rb wb และ rb Python บน Windows ทำให้ความแตกต่างระหว่างข้อความและไฟล์ไบนารีอักขระบรรทัดสุดท้ายในไฟล์ข้อความจะมีการเปลี่ยนแปลงเล็กน้อยเมื่ออ่านหรือเขียนข้อมูล การแก้ไขข้อมูลเบื้องหลังนี้เป็นข้อมูลไฟล์ ASCII ที่ถูกต้อง แต่ข้อมูลไบต์ที่มันมีความเสียหายเท่ากับไฟล์ JPEG หรือ EXE ระมัดระวังในการใช้โหมดไบนารีเมื่ออ่านและเขียนไฟล์ดังกล่าว ใน Unix จะไม่สามารถเพิ่มโหมด b ลงในโหมดได้ดังนั้นคุณจึงสามารถใช้แพลตฟอร์มนี้ได้อย่างอิสระสำหรับไฟล์ไบนารีทั้งหมด 7.2.1 เมธอด File Objects ส่วนที่เหลือของตัวอย่างในส่วนนี้จะถือว่าอ็อบเจ็กต์ไฟล์ f ถูกสร้างขึ้นแล้ว หากต้องการอ่านเนื้อหา file8217s ให้เรียก f. read (ขนาด) ซึ่งอ่านปริมาณข้อมูลบางส่วนและส่งกลับเป็นสตริง ขนาดเป็นอาร์กิวเมนต์ตัวเลขที่เป็นตัวเลือก เมื่อขนาดถูกลบหรือลบเนื้อหาทั้งหมดของไฟล์จะได้รับการอ่านและส่งคืนปัญหานี้หากไฟล์มีขนาดใหญ่เป็นสองเท่าของหน่วยความจำเครื่อง8217ของคุณ มิฉะนั้นไบต์ที่มีขนาดใหญ่ที่สุดจะอ่านและส่งคืน ถ้าถึงจุดสิ้นสุดของไฟล์ f. read () จะส่งคืนสตริงว่าง (quotquot) f. readline () อ่านบรรทัดเดียวจากไฟล์อักขระ newline (n) จะถูกปล่อยทิ้งไว้ที่ส่วนท้ายของสตริงและจะถูกละเว้นเฉพาะในบรรทัดสุดท้ายของไฟล์หากไฟล์ doesn8217t สิ้นสุดลงในบรรทัดใหม่ ซึ่งทำให้ค่าที่ส่งคืนไม่คลุมเครือถ้า f. readline () ส่งกลับค่าสตริงที่ว่างเปล่าตอนท้ายของไฟล์ถึงแล้วในขณะที่บรรทัดว่างจะแสดงด้วย n สตริงที่มีบรรทัดใหม่เพียงบรรทัดเดียว สำหรับการอ่านบรรทัดจากไฟล์คุณสามารถวนรอบวัตถุไฟล์ได้ นี่คือหน่วยความจำที่มีประสิทธิภาพรวดเร็วและนำไปสู่โค้ดง่ายๆ: ถ้าคุณต้องการอ่านบรรทัดทั้งหมดของไฟล์ในรายการคุณสามารถใช้รายการ (f) หรือ f. readlines () f. write (string) เขียนเนื้อหาของสตริงไปยังไฟล์โดยส่งคืน None เมื่อต้องการเขียนสิ่งอื่นที่ไม่ใช่สตริงจะต้องแปลงเป็นสตริงก่อน: f. tell () จะคืนค่าจำนวนเต็มให้กับตำแหน่งปัจจุบันของไฟล์ object8217s ในไฟล์วัดเป็นไบต์จากจุดเริ่มต้นของไฟล์ ในการเปลี่ยนตำแหน่งไฟล์ object8217s ให้ใช้ f. seek (offset, fromwhat) ตำแหน่งจะถูกคำนวณจากการเพิ่มค่าชดเชยให้กับจุดอ้างอิงจุดอ้างอิงถูกเลือกโดยอาร์กิวเมนต์ fromwhat ค่าจาก 0 จากจุดเริ่มต้นของแฟ้ม 1 ใช้ตำแหน่งแฟ้มปัจจุบันและ 2 ใช้จุดสิ้นสุดของแฟ้มเป็นจุดอ้างอิง fromwhat สามารถละเว้นและค่าเริ่มต้นเป็น 0 โดยใช้จุดเริ่มต้นของไฟล์เป็นจุดอ้างอิง เมื่อ you8217re ทำกับไฟล์โทร f. close () เพื่อปิดและเพิ่มทรัพยากรระบบใด ๆ ที่นำขึ้นโดยเปิดไฟล์ หลังจากโทร f. close () ความพยายามที่จะใช้วัตถุแฟ้มจะล้มเหลวโดยอัตโนมัติ ควรใช้คำหลักกับคำหลักในการจัดการกับอ็อบเจ็กต์ไฟล์ ข้อดีของไฟล์นี้คือการปิดไฟล์อย่างถูกต้องหลังจากเสร็จสิ้นชุดโปรแกรมแล้วแม้ว่าจะมีข้อยกเว้นเกิดขึ้นก็ตาม นอกจากนี้ยังน้อยกว่าการเขียนเทียบเท่าลอง - finally blocks: วัตถุ File มีวิธีการเพิ่มเติมบางอย่างเช่น isatty () และ truncate () ซึ่งใช้บ่อยๆน้อยลงไปดู Reference Library สำหรับคำแนะนำในการเก็บไฟล์ 7.2.2 การบันทึกข้อมูลที่มีโครงสร้างด้วยสตริง json สามารถเขียนและอ่านจากไฟล์ได้อย่างง่ายดาย ตัวเลขต้องใช้ความพยายามอีกเล็กน้อยเนื่องจาก read () จะคืนค่าสตริงซึ่งจะต้องส่งผ่านไปยังฟังก์ชันเช่น int () ซึ่งใช้สตริง 123 เช่นเดียวกับค่าตัวเลข 123 เมื่อคุณต้องการบันทึกชนิดข้อมูลที่ซับซ้อนกว่าเช่นรายการที่ซ้อนกันและพจนานุกรมการแยกวิเคราะห์และการทำให้เป็นอันดับด้วยมือจะกลายเป็นเรื่องยุ่งยาก แทนที่จะให้ผู้ใช้เขียนและแก้จุดบกพร่องโค้ดเพื่อบันทึกชนิดข้อมูลที่ซับซ้อนลงในไฟล์ Python จะอนุญาตให้คุณใช้รูปแบบการแลกเปลี่ยนข้อมูลที่เป็นที่นิยมเรียกว่า JSON (JavaScript Object Notation) โมดูลมาตรฐานที่เรียกว่า json สามารถใช้ลำดับชั้นข้อมูล Python และแปลงให้เป็นสตริงการแทนกระบวนการนี้เรียกว่า serializing การสร้างข้อมูลใหม่จากการแทนสตริงจะเรียกว่า deserializing ระหว่างการจัดลำดับและ deserializing สตริงที่เป็นตัวแทนของวัตถุอาจถูกเก็บไว้ในไฟล์หรือข้อมูลหรือส่งผ่านการเชื่อมต่อเครือข่ายไปยังเครื่องที่ห่างไกล รูปแบบ JSON มักถูกใช้โดยแอพพลิเคชั่นที่ทันสมัยเพื่อให้สามารถแลกเปลี่ยนข้อมูลได้ โปรแกรมเมอร์หลายคนคุ้นเคยกับมันอยู่แล้วซึ่งเป็นทางเลือกที่ดีสำหรับการทำงานร่วมกัน ถ้าคุณมีวัตถุ x คุณสามารถดูการแทนสตริง JSON ด้วยบรรทัดง่ายๆของโค้ด: ตัวแปรอื่นของ dumps () เรียกว่า dump () เพียง serializes วัตถุไปยังแฟ้ม ดังนั้นหาก f เป็นอ็อบเจ็กต์ไฟล์ที่เปิดขึ้นสำหรับการเขียนเราสามารถทำได้ดังนี้: หากต้องการถอดรหัสวัตถุอีกครั้งถ้า f เป็นอ็อบเจ็กต์ไฟล์ที่ถูกเปิดอ่านแล้ว: เทคนิคการเรียงลำดับแบบนี้สามารถจัดการรายการและพจนานุกรมได้ ใน JSON ต้องใช้ความพยายามเป็นพิเศษ การอ้างอิงสำหรับโมดูล json ประกอบด้วยคำอธิบายนี้ ดอง - โมดูลกระป๋องขัดต่อ JSON ดองเป็นโปรโตคอลที่ช่วยให้การทำให้เป็นอันดับของวัตถุ Python ที่ซับซ้อนโดยพลการ เช่นนี้เป็นเฉพาะ Python และไม่สามารถใช้ในการสื่อสารกับโปรแกรมที่เขียนในภาษาอื่น ๆ นอกจากนี้ยังไม่ปลอดภัยโดยค่าดีฟอลต์: การเก็บข้อมูลดองลงมาจากแหล่งข้อมูลที่ไม่น่าเชื่อถือสามารถสั่งรันโค้ดได้ตามต้องการหากข้อมูลถูกสร้างขึ้นโดยผู้ที่มีทักษะในการโจมตีข้อมูลคำสั่งถอดรหัสต้องเป็นตัวเลข 8 ไบต์ที่ฉันเห็นด้วยตอนนี้นิสัยการเขียนโปรแกรมของฉันดีมาก . ฉันได้แก้ไขรหัส pyDes พื้นฐานจากเว็บไซต์ของตน: เมื่อฉันเรียกใช้โปรแกรมการเข้ารหัสทำงานได้ดี แต่การถอดรหัสจะพ่นผิดพลาด: ขออภัยถ้าเป็นเรื่องที่น่ารำคาญและเรียบง่ายจริงๆ :-( ปัญหาดูเหมือนจะใช้ของคุณ str (.) 2: -1 เพื่อแปลงค่าไบต์เป็นสตริงคุณอาจใช้วิธีนี้หลังจากลองใช้โค้ดต่อไปนี้แล้วพบว่ารายงานข้อผิดพลาด TypeError: ไม่สามารถแปลงอ็อบเจ็กต์ไบต์เป็น str โดยปริยายสิ่งหนึ่งที่ควรทราบเกี่ยวกับ เอาต์พุตของวิธีการเข้ารหัสและถอดรหัส (และอินพุทเช่นกันสำหรับเรื่องที่) คือพวกเขาใช้วัตถุไบต์ไม่สตริง (str) สิ่งที่คุณกำลังทำคือการไบต์วัตถุที่มาจากการเรียกข้อมูล data. encrypt แปลงเป็นสายโดยใช้ str (ซึ่งไม่ใช่วิธีที่ถูกต้องในการทำเช่นนี้) และพยายามถอดรหัสสตริงแทนที่จะเป็นค่าไบต์ที่คุณได้รับจากการเข้ารหัสสิ่งที่คุณต้องทำแทนคือการแปลงข้อความที่จะเข้ารหัส ลงในไบต์โดยใช้วิธีการเข้ารหัสเป็น TR ก่อนส่งข้อมูลนี้ไปที่ data. encrypt คุณต้องระบุชุดอักขระเพื่อทำรหัสนี้เช่น utf-8 เมื่อคุณได้ผลลัพธ์จากการถอดรหัสแล้ว แปลงกลับไปเป็นสตริงโดยใช้วิธีถอดรหัสของอ็อบเจ็กต์ไบต์ อย่างไรก็ตามข้อมูลที่เข้ารหัสลับจะไม่สามารถอ่านได้ในชุดอักขระใด ๆ (มันค่อนข้างจะไม่ดี UTF - 8 รูปดังนั้นอย่าลองแปลงเป็นที่.) ถ้าคุณต้องการดูสิ่งที่ดูเหมือนว่าบางทีสิ่งที่ดีที่สุดที่จะทำคือการใช้ในตัว repr แต่ใช้เฉพาะเมื่อพิมพ์ค่า หลังจากทำการเปลี่ยนแปลงเหล่านี้ heres สิ่งที่ไม่กี่บรรทัดสุดท้ายของรหัสของคุณมีลักษณะเช่น: Heres ผลลัพธ์จากการรันตัวอย่าง: ลำดับ xNN ภายในข้อมูลที่เข้ารหัสเป็นวิธี Python แสดงแต่ละไบต์ภายในไบต์วัตถุที่ arent ในช่วง ASCII ดูคำถามที่ใกล้เคียงกับหัวข้อนี้ IDEPycharm (เฉพาะ python 3.6) เมื่อต้องการตรวจหาเทคโนโลยีที่ใช้ในการสร้างเว็บไซต์ฉันต้องการใช้ builtwith ของแพ็คเกจไซต์ แต่ฉันติดตั้ง python 3.6 เท่านั้น ที่เราทุกคนทราบดีว่าใน python 3.6 เราใช้โมดูล urllib. request, urllib. parse, urllib. error เพื่อแทนที่ urllib2 ดังนั้นจึงไม่สามารถใช้งานแพ็คเกจ builtwith site ได้ แล้วฉันต้องการเขียนแพคเกจเว็บไซต์ฉันเปลี่ยนรูปแบบของการพิมพ์ (เพิ่มวงเล็บ) และทำการเปลี่ยนแปลงบางอย่างดังต่อไปนี้แสดง (เนื่องจากข้อ จำกัด ในการอัปโหลดรูปฉันใส่รหัสเต็มของฉันใน url) ใน builtwiths init py แต่หลังจากขั้นตอนที่ฉันใช้พิมพ์รหัส (builtwith. parse (hao123)) I stills ลาดเทรับเทคโนโลยีที่ใช้ในการสร้างข้อมูลข้อผิดพลาด website. The คือ: ข้อผิดพลาด: urlopen () หายไปอาร์กิวเมนต์ตำแหน่ง 1 ต้อง: url ที่นี่ เป็นรหัสของฉัน: ลอง: ขอ urllib. request. Request (url, ไม่มี) สำนักงาน: ขอ urllib2.Request (url, None) ถ้า html: request. getmethod lambda: HEAD ตอบ urllib. request. urlopen (url) office: ตอบ urllib2.urlopen (ขอ) คำถามของฉันคือฉันจะเปลี่ยน init. py เพื่อให้ได้สิ่งที่ฉันต้องการหรือสิ่งอื่นไฟล์อื่น ๆ ใน builtwith ฉันต้องเปลี่ยนหรือเว็บไซต์ที่แพคเกจสามารถใช้ใน python3 เพื่อแทนที่ builtwith และในลักษณะนี้ I dont ต้องเปลี่ยน init. py เพื่อความสะดวกของฉันฉันใส่ init. py เปลี่ยนแปลงใน urlThe เปลี่ยน init. py นี้คุณควรช่วยฉัน ข้อผิดพลาดฉันกำลังรับ i am พยายามรับข้อมูลจากหลามเพื่อ yaml และแสดงไฟล์ yaml ให้อาหาร varibles. and jinja2 กับ ipaddr i ipsubnet ตัวกรองฉันพยายามที่จะได้รับ 29 subnet แรกสำหรับการเชื่อมต่อของฉันและกำหนด ip แรก ที่อยู่ของ subnet นี้เพื่อ gig 00 และสอง gig 01 อย่างใดในขณะที่ ipaddr () ทำงานในตัวกรอง jinja2 ipsubnet () ไม่ทำงาน กรุณาช่วยและฉันได้รับข้อผิดพลาดนี้เมื่อฉันวิ่งฉันได้พยายามเปลี่ยนโฮสต์จากรันบน bash ภายใน virtualenv ของฉันซึ่งเป็นค่าเริ่มต้น localhost เพื่อ 0.0.0.0 แต่ does not ทำงาน. ทำไมมันไม่ทำงานฉันใช้ Python ใน Selenium webdriver ในระบบอัตโนมัติของการลงทะเบียน Gmail ฉันจะเปิดเดือนแบบเลื่อนลง แต่ไม่เลือกองค์ประกอบเป็นไปได้อย่างใดฝังโค้ด Python ลงใน HTML และสไตล์ด้วย CSS Ive เพิ่งเริ่มเรียน Python และฉันมีความคิดที่จะทำให้สิ่งเล็ก ๆ ออกจากสิ่งที่ฉันได้เรียนรู้ โดยทั่วไปฉันสร้างเครื่องคิดเลขขนาดเล็กซึ่ง ณ ตอนนี้ฉันเพียงรู้วิธีการเรียกใช้ใน Python IDEL ฉันต้องการฝังลงในเว็บไซต์ของฉันและใช้ CSS เพื่อกำหนดสไตล์บางฟิลด์ แต่ฉันไม่รู้ว่าจะเริ่มต้นที่ไหนและหากเป็นไปได้ Heres รหัสฉันเขียน. ฉันมีสตริงเข้ารหัสที่ฉันได้รับจาก API สำหรับเหตุผลด้านความปลอดภัยฉันไม่สามารถมีคีย์ใน java แม้ว่าจะไม่ใช่ว่ามันจะฆ่าฉันจะมีใน java แต่ยัง. นี่คือรหัส thats การทำงานใน java: สำคัญสำหรับฉันไปไม่เพียงมีคีย์ใน NDK แต่ยังใช้ขั้นตอนวิธี. ทั้งหมดนี้ทำให้ยากที่จะหาวิธีถอดรหัสหากมีคนพยายามที่จะถอดรหัส ตัวอย่างของวิธีการทำเช่นนี้ใน NDK นี่เป็นครั้งแรกที่ใช้ NDK ฉันสับสนจริงๆและต้องการความช่วยเหลือเกี่ยวกับปัญหาที่เกี่ยวข้องกับ TOTP ตามที่ระบุใน RFC6238 ที่นี่: tools. ietf. orghtmlrfc6238section-1.2 ตอนนี้ฉันได้รับมอบหมายให้ใช้ RFC6238 เพื่อสร้างรหัสผ่าน TOTP 10 หลักซึ่งจะใช้ในคำขอ POST ในภายหลัง ตัวอย่างอินพุตและเอาต์พุตสำหรับ TOTP ควรเป็นเช่นนี้: คีย์ที่ใช้ร่วมกัน: ninjaexampleHDECHALLENGE003 (ไม่มีเครื่องหมายคำพูดคู่) ฟังก์ชันแฮชที่ใช้: HMAC-SHA-512 T0 0, Timestep 30 วินาที (ตามที่ระบุใน RFC6238) คาดว่า TOTP จาก 10 ตัวเลขที่สำเร็จ TOTP สร้าง: 1773133250 สำหรับเวลา Mon, 17 Mar 2014 15:20:51 GMT base64 เข้ารหัสโพสต์คำขออนุญาต usernamepassword: bmluamFAZXhhbXBsZS5jb206MTc3MzEzMl1M (ฉันได้ถอดรหัสการให้สิทธิ์ POST ตัวอย่างเป็น ninjaexample: 1773133250 เพราะเหตุนี้ฉันจึงสามารถพูดได้ว่าตัวอย่าง เอาท์พุท TOTP เป็น 1773133250) ตอนนี้ปัญหาที่ฉันมีหลังจากที่พยายามที่จะทำให้สคริปต์ของตัวเองตามข้อกำหนด rfc6238 ฉันไม่สามารถรับเอาท์พุทเดียวกันสำหรับการป้อนข้อมูลตัวอย่างเช่นข้างต้น ฉันได้ลองใช้โมดูล TOTP ออนไลน์อื่นที่พร้อมใช้งานออนไลน์ (ส่วนใหญ่เป็นภาษา Python) เพื่อหาว่าพวกเขาสร้างผลลัพธ์เช่นเดียวกับสคริปต์ที่ฉันสร้างไว้ สุดท้ายผมก็พยายามที่จะคัดลอกทันทีและเรียกใช้รหัส Java ได้รับในตัวอย่างของ RFC6238 และขึ้นมาพร้อมกับผลเช่นเดียวกับสคริปต์ของฉันคือ: Hex เมล็ดเข้ารหัสเพื่อ HMAC512: 6E696E6A61406578616D706C652E636F6D4844454348414C4C454E4745303033 6E696E6A61406578616D706C652E636F6D4844454348414C4C454E4745303033 เวลาป้อนนั้น 1395069651L คิดเป็นเวลาที่ได้รับใน ผลลัพธ์จากการพยายาม (ผลลัพธ์เดียวกันจากสคริปต์ที่กำหนดเองโมดูล Python อื่น ๆ และการใช้งาน Java ที่ระบุในเอกสาร RFC6238): Generated TOTP: 0490867067 ฉันสับสนจริงๆตอนนี้เนื่องจากเชื่อว่าฉันได้ปฏิบัติตามคำแนะนำที่กำหนดโดยงานแล้ว แม้ใช้จริง RFC ให้รหัส Java เท่านั้นแล้วพบว่าพวกเขาจะไม่สร้าง ouput เดียวกันเป็นหนึ่งในงาน ฉันได้ติดต่อผู้ให้บริการเพื่อทราบว่ามีข้อผิดพลาดหรือไม่ แต่พวกเขากล่าวว่ามันถูกต้องแล้ว บางทีฉันอาจหายไปบางอย่างที่นี่เช่นวิธีที่ผู้ให้บริการงานจริงเข้ารหัสลับคีย์ที่ใช้ร่วมกันฉันใหม่มากในเรื่องนี้และความรู้เกี่ยวกับข้อแม้ต่างๆเช่นการเข้ารหัสคีย์ที่แตกต่างกันทำให้แตกต่างกัน TOTP จะได้รับการชื่นชมจริงๆ ขอขอบคุณสำหรับความช่วยเหลือเกี่ยวกับเรื่องนี้และเพื่อให้ฉันเข้าใจถึงลักษณะของ TOTP นี้ขอบคุณ :) Im กำลังอยู่ในระหว่างการเรียนรู้เกี่ยวกับการเข้ารหัสและ im หวังจะหาคำชี้แจงเพิ่มเติมเกี่ยวกับสิ่งที่เรียนรู้ ดังนั้นสำหรับปัญหาเฉพาะที่พบในชั้นเรียนซึ่งเราได้พูดถึงเกี่ยวกับการใช้การเข้ารหัส AES-128-CBC และการบล็อกสุดท้ายเป็นแฮช ตัวอย่างเช่นการแฮชคำ hello จะเข้ารหัสลับ hello โดยใช้ AES-128-CBC และส่งออกบล็อกล่าสุด ดังนั้นฉันรู้ว่ามันไม่ชนฟรี แต่มันเป็นไปได้ที่จะหาชนให้คีย์และ iv Ive คิดเกี่ยวกับช่องโหว่เกี่ยวกับแผ่นหรือความยาวของข้อความที่แตกต่างกัน แต่ในตอนท้ายของวันที่ฉันเพียงแค่ dont คิดว่าเป็นไปได้ CodeGur เป็นไซต์พร็อกซี่ StackOverFlow16.2 io 8212 เครื่องมือหลักสำหรับการทำงานกับลำธาร 16.2.1 ภาพรวมโมดูล io มีสิ่งอำนวยความสะดวกหลักสำหรับ Python8217s เพื่อจัดการกับ IO ประเภทต่างๆ มีสามประเภทหลักของ IO: ข้อความ IO ไบนารี IO และดิบ IO เหล่านี้เป็นหมวดหมู่ทั่วไปและร้านสำรองต่างๆสามารถใช้สำหรับแต่ละร้านได้ วัตถุคอนกรีตที่อยู่ในประเภทเหล่านี้เรียกว่าวัตถุแฟ้ม ข้อกำหนดทั่วไปอื่น ๆ ได้แก่ สตรีมและไฟล์ที่เหมือนกัน วัตถุที่เป็นรูปลำแสงคอนกรีตแต่ละชนิดจะมีคุณสมบัติที่หลากหลายเช่นสามารถอ่านอย่างเดียวเขียนอย่างเดียวหรืออ่านเขียนได้ นอกจากนี้ยังสามารถอนุญาตการเข้าถึงโดยพลการโดยพลการ (การแสวงหาไปข้างหน้าหรือย้อนกลับไปยังตำแหน่งใด ๆ ) หรือการเข้าถึงตามลำดับ (เช่นในกรณีของซ็อกเก็ตหรือท่อ) สตรีมทั้งหมดจะระมัดระวังเกี่ยวกับประเภทของข้อมูลที่คุณให้ไว้ เช่นให้วัตถุ str กับ write () วิธีการของกระแสไบนารีจะเพิ่ม TypeError ดังนั้นจะให้ไบต์วัตถุที่เขียนวิธี () ของสตรีมข้อความ เปลี่ยนในเวอร์ชัน 3.3: การดำเนินการที่ใช้ในการเพิ่ม IOError ขณะนี้เพิ่ม OSError เนื่องจาก IOError เป็นชื่อแทนของ OSError 16.2.1.1 ข้อความ IO Text IO คาดว่าและสร้างวัตถุ str ซึ่งหมายความว่าเมื่อใดก็ตามที่ร้านสำรองทำมาจากไบต์ (เช่นในกรณีของไฟล์) การเข้ารหัสและถอดรหัสข้อมูลจะทำได้อย่างโปร่งใสและเป็นตัวเลือกสำหรับการแปลอักขระแพลตฟอร์มใหม่ที่เฉพาะเจาะจงสำหรับแพลตฟอร์ม วิธีที่ง่ายที่สุดในการสร้างสตรีมข้อความคือ open () ระบุสตริงการเข้ารหัส: สตรีมข้อความในหน่วยความจำจะมีให้เป็นอ็อบเจ็กต์ StringIO: API สตรีมข้อความจะอธิบายในรายละเอียดในเอกสารประกอบของ TextIOBase 16.2.1.2 ไบนารี IO ไบนารี IO (เรียกว่า buffered IO) คาดว่าวัตถุไบต์เหมือนและสร้างไบต์วัตถุ ไม่มีการเข้ารหัสการถอดรหัสหรือการแปลข้อความใหม่ สตรีมประเภทนี้สามารถใช้ได้กับข้อมูลที่ไม่ใช่ข้อความทุกประเภทและเมื่อต้องมีการควบคุมด้วยตนเองในการจัดการกับข้อมูลข้อความ วิธีที่ง่ายที่สุดในการสร้างกระแสไบนารีคือ open () กับ b ในสตริงโหมด: ไบนารีในหน่วยความจำยังมีให้เป็นอ็อบเจ็กต์ BytesIO: API กระแสไบนารีอธิบายไว้ในรายละเอียดในเอกสารของ BufferedIOBase โมดูลไลบรารีอื่น ๆ อาจมีวิธีเพิ่มเติมในการสร้างข้อความหรือสตรีมไบนารี ดูตัวอย่าง socket. socket. makefile () 16.2.1.3 Raw IO ดิบ IO ดิบ (เรียกว่า unbuffered IO) โดยทั่วไปจะใช้เป็นอาคารระดับต่ำสำหรับบล็อกไบนารีและข้อความไม่ค่อยมีประโยชน์ในการจัดการกระแสดิบโดยตรงจากรหัสผู้ใช้ อย่างไรก็ตามคุณสามารถสร้างสตรีมดิบโดยการเปิดไฟล์ในโหมดไบนารีโดยมีการปิดใช้บัฟเฟอร์: API สตรีมดิบถูกอธิบายในรายละเอียดในเอกสารของ RawIOBase 16.2.2 อินเทอร์เฟซโมดูลระดับสูง int ที่มีขนาดบัฟเฟอร์ดีฟอลต์ที่ใช้โดยคลาส IO buffered module8217s open () ใช้ blksize file8217s (ตามที่ได้รับจาก os. stat ()) ถ้าเป็นไปได้ นี่คือนามแฝงสำหรับ openin () function ข้อยกเว้น io BlockingIOError นี่เป็นชื่อแทนความเข้ากันได้ของ BlockingIOError builtin ข้อยกเว้น io UnsupportedOperation ข้อยกเว้นที่สืบทอด OSError และ ValueError ที่เพิ่มขึ้นเมื่อมีการเรียกใช้การดำเนินการที่ไม่สนับสนุนในสตรีม 16.2.2.1 สตรีมในหน่วยความจำนอกจากนี้ยังสามารถใช้วัตถุ str หรือ bytes เป็นไฟล์สำหรับการอ่านและเขียน สำหรับสายอักขระ StringIO สามารถใช้เช่นไฟล์ที่เปิดอยู่ในโหมดข้อความ BytesIO สามารถใช้เช่นไฟล์ที่เปิดอยู่ในโหมดไบนารี ทั้งสองมีความสามารถในการอ่านและเขียนแบบเต็มรูปแบบพร้อมการเข้าถึงแบบสุ่ม 16.2.3 ลำดับชั้นคลาสการใช้งานสตรีม IO จะถูกจัดเป็นลำดับชั้นของชั้นเรียน ชั้นฐานข้อมูลนามธรรม (ABCs) ซึ่งใช้เพื่อระบุประเภทของลำธารต่างๆแล้วใช้คลาสคอนกรีตเพื่อสร้างการใช้งานสตรีมมาตรฐาน คลาสพื้นฐานนามธรรมยังมีการใช้งานเริ่มต้นของวิธีการบางอย่างเพื่อช่วยในการใช้คลาสสตรีมคอนกรีต ตัวอย่างเช่น BufferedIOBase มีการใช้งาน readinto () และ readline () ที่ไม่มีการ จำกัด การใช้งาน ที่ด้านบนของลำดับชั้นของ IO คือ IOBase ชั้นฐานนามธรรม กำหนดส่วนติดต่อพื้นฐานเข้ากับสตรีม อย่างไรก็ตามโปรดทราบว่าไม่มีการแยกระหว่างการอ่านและเขียนไปยังการใช้งานสตรีมได้รับอนุญาตให้เพิ่ม UnsupportedOperation หากไม่สนับสนุนการดำเนินการที่ระบุ ABC RawIOBase ขยาย IOBase เกี่ยวข้องกับการอ่านและเขียนไบต์กับสตรีม FileI ชั้นย่อย RawIOBase เพื่อให้อินเตอร์เฟซกับไฟล์ในระบบไฟล์ machine8217s BufferedIOBase ABC เกี่ยวข้องกับการบัฟเฟอร์ในสตรีมไบต์ดิบ (RawIOBase) Subclasses, BufferedWriter BufferedReader และ BufferedRWPair บัฟเฟอร์สตรีมที่อ่านได้เขียนได้และสามารถอ่านได้และสามารถเขียนได้ BufferedRandom มีอินเทอร์เฟซแบบบัฟเฟอร์สำหรับสตรีมการเข้าถึงแบบสุ่ม อีกบัฟเฟอร์ BufferedIOBase, BytesIO คือสตรีมของไบต์ในหน่วยความจำ TextIOBase ABC อีกชั้นหนึ่งของ IOBase เกี่ยวข้องกับสตรีมที่ไบต์แสดงข้อความและจัดการการเข้ารหัสและถอดรหัสไปยังและจากสตริง TextIOWrapper ซึ่งขยายเป็นส่วนติดต่อข้อความบัฟเฟอร์ไปยังสตรีมดิบแบบบัฟเฟอร์ (BufferedIOBase) สุดท้าย StringIO เป็นสตรีมในหน่วยความจำสำหรับข้อความ ชื่ออาร์กิวเมนต์ไม่ใช่ส่วนหนึ่งของข้อกำหนดและเฉพาะอาร์กิวเมนต์ของ open () เท่านั้นที่มีวัตถุประสงค์เพื่อใช้เป็นอาร์กิวเมนต์คำหลัก ตารางต่อไปนี้สรุป ABCs โดยโมดูล io: 16.2.3.1 IO Base Class คลาสพื้นฐานนามธรรมสำหรับทุกชั้นเรียน IO, ทำหน้าที่ในลำธารของไบต์ ไม่มีตัวสร้างสาธารณะ คลาสนี้มีการใช้งานนามธรรมที่ว่างเปล่าสำหรับวิธีการต่างๆที่ชั้นเรียนที่ได้รับสามารถแทนที่การเลือกใช้งานที่เป็นค่าเริ่มต้นแทนไฟล์ที่ไม่สามารถอ่านเขียนหรือหาได้ แม้ว่า IOBase ไม่ได้ประกาศอ่าน () readinto () หรือเขียน () เนื่องจากลายเซ็นของพวกเขาจะแตกต่างกันการใช้งานและลูกค้าควรพิจารณาวิธีการเหล่านั้นเป็นส่วนหนึ่งของอินเทอร์เฟซ นอกจากนี้การใช้งานอาจเพิ่ม ValueError (หรือ UnsupportedOperation) เมื่อการดำเนินการที่ไม่รองรับจะเรียก ชนิดพื้นฐานที่ใช้สำหรับข้อมูลไบนารีที่อ่านจากหรือเขียนลงในไฟล์เป็นไบต์ วัตถุอื่น ๆ ที่เป็นไบต์เหมือนกันได้รับการยอมรับว่าเป็นอาร์กิวเมนต์ของเมธอดด้วย ในบางกรณีเช่น readinto () ต้องมีวัตถุที่สามารถเขียนได้เช่น bytearray ชั้นข้อความ IO ทำงานกับข้อมูล STR โปรดทราบว่าการโทรหาวิธีใด ๆ (แม้กระทั่งการสอบถาม) ในสตรีมแบบปิดจะไม่ได้รับการระบุ การใช้งานอาจทำให้ ValueError เกิดขึ้นได้ในกรณีนี้ IOBase (และ subclasses ของมัน) สนับสนุนโปรโตคอล iterator ซึ่งหมายความว่าวัตถุ IOBase สามารถ iterated มากกว่า yielding เส้นในสตรีม เส้นจะมีการกำหนดแตกต่างกันเล็กน้อยขึ้นอยู่กับว่าสตรีมเป็นสตรีมมิ่ง (yielding bytes) หรือสตรีมข้อความ (ให้อักขระสตริง) ดู readline () ด้านล่าง IOBase ยังเป็นผู้จัดการเนื้อหาและสนับสนุนคำสั่งด้วย ในตัวอย่างนี้ไฟล์ถูกปิดหลังจากที่ชุดคำสั่ง 8282 กับ 8282even เสร็จสิ้นแล้วหากมีข้อยกเว้นเกิดขึ้น: IOBase มีแอตทริบิวต์และวิธีการข้อมูลเหล่านี้: ล้างและปิดกระแสข้อมูลนี้ เมธอดนี้ไม่มีผลหากแฟ้มถูกปิดไปแล้ว เมื่อไฟล์ถูกปิดการดำเนินการใด ๆ ในไฟล์ (เช่นการอ่านหรือเขียน) จะเป็นการเพิ่ม ValueError เป็นความสะดวกสบายที่ได้รับอนุญาตให้เรียกวิธีนี้มากกว่าหนึ่งครั้งเท่านั้นโทรครั้งแรก แต่จะมีผล จริงถ้าปิดสตรีม แสดงตัวอธิบายไฟล์ (จำนวนเต็ม) ของไฟล์ต้นแบบหากมีอยู่ OSError จะเพิ่มขึ้นถ้าอ็อบเจ็กต์ IO ไม่ใช้ descriptor ไฟล์ ล้างข้อมูลบัฟเฟอร์การเขียนของสตรีมหากมี ไม่ต้องทำอะไรสำหรับสตรีมแบบอ่านอย่างเดียวและไม่ปิดกั้น กลับ True ถ้าสตรีมมีการโต้ตอบ (เช่นเชื่อมต่อกับอุปกรณ์ปลายทาง) คืนค่า True ถ้าสามารถอ่านสตรีมจาก ถ้าเป็นเท็จ อ่าน () จะเพิ่ม OSError อ่านและส่งคืนบรรทัดเดียวจากสตรีม หากระบุขนาดไว้จะอ่านไบต์ขนาดได้มากที่สุด ตัวยุติบรรทัดจะเป็นค่า bn สำหรับไฟล์ไบนารีเสมอสำหรับไฟล์ข้อความอาร์กิวเมนต์ newline เพื่อเปิด () สามารถใช้เพื่อเลือก terminator บรรทัด (s) ที่รู้จัก อ่านและส่งคืนรายการบรรทัดจากสตรีม คำแนะนำสามารถระบุเพื่อควบคุมจำนวนบรรทัดที่อ่านได้: ไม่ควรอ่านบรรทัดเพิ่มเติมหากขนาดรวม (เป็นไบต์) ของทุกบรรทัดจะเกินคำแนะนำ โปรดทราบว่า it8217s เป็นไปได้ที่จะทำซ้ำกับอ็อบเจ็กต์ไฟล์โดยใช้บรรทัดในไฟล์ โดยไม่ต้องเรียกไฟล์.readlines () เปลี่ยนตำแหน่งสตรีมไปเป็นไบต์ที่กำหนด ออฟเซ็ตจะถูกตีความเทียบกับตำแหน่งที่ระบุโดยไหน ค่าเริ่มต้นสำหรับ SEEKSET คืออะไร ค่าเริ่มต้นคือ SEEKSET หรือ 0 8211 เริ่มต้นของกระแสข้อมูล (ค่าเริ่มต้น) ออฟเซ็ตควรเป็นศูนย์หรือบวก SEEKCUR หรือ 1 8211 ตำแหน่งปัจจุบันของกระแสออฟเซ็ตอาจเป็นค่าลบ SEEKEND หรือ 2 8211 ส่วนท้ายของการชดเชยกระแสมักจะเป็นค่าลบ ตำแหน่ง. ใหม่ในรุ่น 3.1: ค่าคงที่ของ SEEK ใหม่ในเวอร์ชัน 3.3: ระบบปฏิบัติการบางระบบสามารถสนับสนุนค่าเพิ่มเติมเช่น os. SEEKHOLE หรือ os. SEEKDATA ค่าที่ถูกต้องสำหรับไฟล์อาจขึ้นอยู่กับการเปิดข้อความหรือโหมดไบนารี ส่งกลับค่า True ถ้าสตรีมสนับสนุนการเข้าถึงแบบสุ่ม ถ้าเป็นเท็จ แสวงหา(). tell () และ truncate () จะเพิ่ม OSError กลับตำแหน่งสตรีมปัจจุบัน ปรับขนาดสตรีมตามขนาดที่ระบุเป็นไบต์ (หรือตำแหน่งปัจจุบันหากไม่ได้ระบุขนาด) ตำแหน่งกระแสข้อมูล isn8217t เปลี่ยนแล้ว การปรับขนาดนี้สามารถขยายหรือลดขนาดไฟล์ปัจจุบันได้ ในกรณีของการขยายเนื้อหาของพื้นที่ไฟล์ใหม่ขึ้นอยู่กับแพลตฟอร์ม (ในระบบส่วนใหญ่ไบต์เพิ่มเติมจะเติมศูนย์) ขนาดไฟล์ใหม่จะถูกส่งกลับ เปลี่ยนเป็นเวอร์ชัน 3.5: ขณะนี้ Windows จะกรอกข้อมูลเป็นศูนย์เมื่อขยาย กลับ True ถ้าสตรีมสนับสนุนการเขียน ถ้าเป็นเท็จ write () และ truncate () จะเพิ่ม OSError เขียนรายการบรรทัดลงในสตรีม ไม่ได้เพิ่มตัวคั่นบรรทัดดังนั้นจึงเป็นเรื่องปกติสำหรับแต่ละบรรทัดที่ระบุว่ามีตัวคั่นบรรทัดที่ท้าย เตรียมความพร้อมสำหรับการทำลายวัตถุ IOBase ให้การติดตั้งเริ่มต้นของเมธอดนี้ซึ่งเรียกเมธอด close82 () ของ instance8217s คลาสพื้นฐานสำหรับไบนารีดิบ IO สืบทอด IOBase ไม่มีตัวสร้างสาธารณะ ไบนารีดิบ IO มักให้สิทธิ์การเข้าถึงระดับต่ำไปยังอุปกรณ์หรือ API ที่อยู่ภายใต้การทำงานและไม่พยายามที่จะห่อหุ้มห่อหุ้มไว้ในพริสตอรีระดับสูง (ซึ่งเหลืออยู่ใน Buffered IO และ Text IO ซึ่งอธิบายไว้ในภายหลัง) นอกเหนือจากคุณลักษณะและวิธีการจาก IOBase แล้ว RawIOBase มีวิธีการดังต่อไปนี้: อ่านขนาดไบต์จากวัตถุและส่งคืนข้อมูล เป็นความสะดวกถ้าขนาดไม่ระบุหรือ -1 เรียกว่า readall () มิเช่นนั้นจะมีการเรียกระบบเพียงครั้งเดียวเท่านั้น ไบต์น้อยกว่าไบต์ขนาดอาจถูกส่งกลับถ้าระบบปฏิบัติการส่งกลับค่าน้อยกว่าไบต์ขนาด ถ้ามีการส่งคืนไบต์ 0 และขนาดไม่ใช่ 0 แสดงว่าท้ายสุดของไฟล์ ถ้าออบเจกต์อยู่ในโหมดไม่บล็อกและไม่มีไบต์จะไม่มีการส่งคืน อ่านและส่งคืนไบต์ทั้งหมดจากสตรีมไปจนถึง EOF โดยใช้การเรียกหลาย ๆ ครั้งไปยังสตรีมหากจำเป็น อ่านไบต์ลงในออบเจ็กต์ที่คล้ายกับไบต์ที่เขียนไว้ล่วงหน้า b. และส่งกลับจำนวนไบต์ที่อ่าน ถ้าออบเจกต์อยู่ในโหมดไม่บล็อกและไม่มีไบต์จะไม่มีการส่งคืน เขียนไบต์ที่มีลักษณะเหมือนวัตถุ ข. ไปยังสตรีดิบต้นแบบและส่งคืนจำนวนไบต์ที่เขียน ค่านี้อาจน้อยกว่าความยาวของไบต์โดยขึ้นอยู่กับรายละเอียดเฉพาะของสตรีมดิบพื้นฐานและโดยเฉพาะอย่างยิ่งหากอยู่ในโหมดไม่บล็อก จะไม่มีการส่งคืนหากสตรีมดิบถูกตั้งค่าไว้ไม่ให้บล็อกและไม่มีไบต์เดียวที่สามารถเขียนลงไปได้ ผู้เรียกอาจปล่อยหรือเปลี่ยนตัว b หลังจากที่วิธีนี้ส่งกลับดังนั้นการใช้งานควรเข้าถึงขระหว่างการเรียกเมธอด ชั้นไอโอ BufferedIOBase Base class สำหรับสตรีมไบนารีที่สนับสนุนบัฟเฟอร์บางประเภท สืบทอด IOBase ไม่มีตัวสร้างสาธารณะ ความแตกต่างหลักกับ RawIOBase คือวิธีการอ่าน () readinto () และ write () จะพยายาม (ตามลำดับ) เพื่ออ่านข้อมูลให้มากที่สุดเท่าที่ต้องการหรือเพื่อให้ได้ผลลัพธ์ที่ได้รับทั้งหมดค่าใช้จ่ายในการทำให้ระบบอาจเรียกได้มากกว่าหนึ่งระบบ นอกจากนี้วิธีการเหล่านี้สามารถเพิ่ม BlockingIOError หากสตรีดิบต้นแบบอยู่ในโหมดไม่บล็อกและไม่สามารถใช้หรือให้ข้อมูลที่เพียงพอซึ่งแตกต่างจากคู่ฉบับ RawIOBase ของพวกเขาพวกเขาจะไม่มีวันกลับ None นอกจากนี้เมธอดอ่าน () ยังไม่มีการใช้งานดีฟอลต์ที่ทำให้โปรแกรมอ่านข้อมูลไม่ได้ () readinto () การใช้ BufferedIOBase ทั่วไปไม่ควรสืบทอดจากการใช้งาน RawIOBase แต่ให้ห่อหนึ่งเช่น BufferedWriter และ BufferedReader ทำ BufferedIOBase แสดงหรือแทนที่วิธีและแอตทริบิวต์เหล่านี้นอกเหนือจาก IOBase: สตรีมดิบพื้นฐาน (อินสแตนซ์ RawIOBase) ที่ BufferedIOBase เกี่ยวข้อง นี่ไม่ใช่ส่วนหนึ่งของ BufferedIOBase API และอาจไม่มีอยู่ใน implementations บางอย่าง แยกกระแสดิบต้นแบบจากบัฟเฟอร์และส่งกลับ หลังจากสตรีมดิบถูกถอดออกบัฟเฟอร์อยู่ในสภาวะที่ไม่สามารถใช้งานได้ บัฟเฟอร์บางอย่างเช่น BytesIO ไม่มีแนวคิดของสตรีดิบเดียวที่จะกลับมาจากวิธีนี้ พวกเขายก UnsupportedOperation ใหม่ในเวอร์ชัน 3.1 อ่านและกลับไปที่ไบต์ขนาด ถ้าอาร์กิวเมนต์ถูกละเว้นไม่มี หรือลบข้อมูลจะอ่านและส่งคืนจนกว่าจะถึง EOF ไบต์เปล่าจะถูกส่งคืนหากสตรีมอยู่ที่ EOF แล้ว ถ้าอาร์กิวเมนต์เป็นบวกและสตรีดิบต้นแบบไม่โต้ตอบการอ่านดิบหลาย ๆ ครั้งอาจได้รับเพื่อตอบสนองการนับไบต์ (ยกเว้นกรณีที่ EOF ถึงก่อน) แต่สำหรับสตรีดิบแบบอินเทอร์แอคทีฟจะมีการอ่านดิบแบบอ่านอย่างน้อยหนึ่งครั้งและผลสรุปสั้น ๆ ไม่ได้หมายความว่า EOF กำลังใกล้เข้ามา BlockingIOError จะเพิ่มขึ้นถ้าสตรีดิบต้นแบบอยู่ในโหมดไม่บล็อกและไม่มีข้อมูลที่สามารถใช้ได้ในขณะนี้ อ่านและส่งคืนข้อมูลไบต์ขนาดโดยไม่เกินหนึ่งครั้งเรียกใช้เมธอด read () (หรือ readinto ()) ดิบ stream8217s This can be useful if you are implementing your own buffering on top of a BufferedIOBase object. Read bytes into a pre-allocated, writable bytes-like object b and return the number of bytes read. Like read(). multiple reads may be issued to the underlying raw stream, unless the latter is interactive. A BlockingIOError is raised if the underlying raw stream is in non blocking-mode, and has no data available at the moment. Read bytes into a pre-allocated, writable bytes-like object b . using at most one call to the underlying raw stream8217s read() (or readinto() ) method. Return the number of bytes read. A BlockingIOError is raised if the underlying raw stream is in non blocking-mode, and has no data available at the moment. New in version 3.5. Write the given bytes-like object. b . and return the number of bytes written (always equal to the length of b in bytes, since if the write fails an OSError will be raised). Depending on the actual implementation, these bytes may be readily written to the underlying stream, or held in a buffer for performance and latency reasons. When in non-blocking mode, a BlockingIOError is raised if the data needed to be written to the raw stream but it couldn8217t accept all the data without blocking. The caller may release or mutate b after this method returns, so the implementation should only access b during the method call. 16.2.3.2. Raw File IO FileIO represents an OS-level file containing bytes data. It implements the RawIOBase interface (and therefore the IOBase interface, too). The name can be one of two things: a character string or bytes object representing the path to the file which will be opened. In this case closefd must be True (the default) otherwise an error will be raised. an integer representing the number of an existing OS-level file descriptor to which the resulting FileIO object will give access. When the FileIO object is closed this fd will be closed as well, unless closefd is set to False . The mode can be r. W x or a for reading (default), writing, exclusive creation or appending. The file will be created if it doesn8217t exist when opened for writing or appending it will be truncated when opened for writing. FileExistsError will be raised if it already exists when opened for creating. Opening a file for creating implies writing, so this mode behaves in a similar way to w. Add a to the mode to allow simultaneous reading and writing. The read() (when called with a positive argument), readinto() and write() methods on this class will only make one system call. A custom opener can be used by passing a callable as opener . The underlying file descriptor for the file object is then obtained by calling opener with ( name . flags ). opener must return an open file descriptor (passing os. open as opener results in functionality similar to passing None ). See the open() built-in function for examples on using the opener parameter. Changed in version 3.3: The opener parameter was added. The x mode was added. Changed in version 3.4: The file is now non-inheritable. In addition to the attributes and methods from IOBase and RawIOBase. FileIO provides the following data attributes: The mode as given in the constructor. The file name. This is the file descriptor of the file when no name is given in the constructor. 16.2.3.3. Buffered Streams Buffered IO streams provide a higher-level interface to an IO device than raw IO does. A stream implementation using an in-memory bytes buffer. It inherits BufferedIOBase. The buffer is discarded when the close() method is called. The optional argument initialbytes is a bytes-like object that contains initial data. BytesIO provides or overrides these methods in addition to those from BufferedIOBase and IOBase : Return a readable and writable view over the contents of the buffer without copying them. Also, mutating the view will transparently update the contents of the buffer: As long as the view exists, the BytesIO object cannot be resized or closed. New in version 3.2. Return bytes containing the entire contents of the buffer. In BytesIO. this is the same as read() . In BytesIO. this is the same as readinto() . New in version 3.5. class io. BufferedReader ( raw . buffersizeDEFAULTBUFFERSIZE ) A buffer providing higher-level access to a readable, sequential RawIOBase object. It inherits BufferedIOBase. When reading data from this object, a larger amount of data may be requested from the underlying raw stream, and kept in an internal buffer. The buffered data can then be returned directly on subsequent reads. The constructor creates a BufferedReader for the given readable raw stream and buffersize . If buffersize is omitted, DEFAULTBUFFERSIZE is used. BufferedReader provides or overrides these methods in addition to those from BufferedIOBase and IOBase : Return bytes from the stream without advancing the position. At most one single read on the raw stream is done to satisfy the call. The number of bytes returned may be less or more than requested. Read and return size bytes, or if size is not given or negative, until EOF or if the read call would block in non-blocking mode. Read and return up to size bytes with only one call on the raw stream. If at least one byte is buffered, only buffered bytes are returned. Otherwise, one raw stream read call is made. class io. BufferedWriter ( raw . buffersizeDEFAULTBUFFERSIZE ) A buffer providing higher-level access to a writeable, sequential RawIOBase object. It inherits BufferedIOBase. When writing to this object, data is normally placed into an internal buffer. The buffer will be written out to the underlying RawIOBase object under various conditions, including: when the buffer gets too small for all pending data when flush() is called when a seek() is requested (for BufferedRandom objects) when the BufferedWriter object is closed or destroyed. The constructor creates a BufferedWriter for the given writeable raw stream. If the buffersize is not given, it defaults to DEFAULTBUFFERSIZE . BufferedWriter provides or overrides these methods in addition to those from BufferedIOBase and IOBase : Force bytes held in the buffer into the raw stream. A BlockingIOError should be raised if the raw stream blocks. Write the bytes-like object. b . and return the number of bytes written. When in non-blocking mode, a BlockingIOError is raised if the buffer needs to be written out but the raw stream blocks. class io. BufferedRandom ( raw . buffersizeDEFAULTBUFFERSIZE ) A buffered interface to random access streams. It inherits BufferedReader and BufferedWriter. and further supports seek() and tell() functionality. The constructor creates a reader and writer for a seekable raw stream, given in the first argument. If the buffersize is omitted it defaults to DEFAULTBUFFERSIZE . class io. BufferedRWPair ( reader . writer . buffersizeDEFAULTBUFFERSIZE ) A buffered IO object combining two unidirectional RawIOBase objects 8211 one readable, the other writeable 8211 into a single bidirectional endpoint. It inherits BufferedIOBase . reader and writer are RawIOBase objects that are readable and writeable respectively. If the buffersize is omitted it defaults to DEFAULTBUFFERSIZE . BufferedRWPair does not attempt to synchronize accesses to its underlying raw streams. You should not pass it the same object as reader and writer use BufferedRandom instead. 16.2.3.4. Text IO Base class for text streams. This class provides a character and line based interface to stream IO. There is no readinto() method because Python8217s character strings are immutable. It inherits IOBase. There is no public constructor. TextIOBase provides or overrides these data attributes and methods in addition to those from IOBase : The name of the encoding used to decode the stream8217s bytes into strings, and to encode strings into bytes. The error setting of the decoder or encoder. A string, a tuple of strings, or None. indicating the newlines translated so far. Depending on the implementation and the initial constructor flags, this may not be available. The underlying binary buffer (a BufferedIOBase instance) that TextIOBase deals with. This is not part of the TextIOBase API and may not exist in some implementations. Separate the underlying binary buffer from the TextIOBase and return it. After the underlying buffer has been detached, the TextIOBase is in an unusable state. Some TextIOBase implementations, like StringIO. may not have the concept of an underlying buffer and calling this method will raise UnsupportedOperation . New in version 3.1. Read and return at most size characters from the stream as a single str. If size is negative or None. reads until EOF. Read until newline or EOF and return a single str. If the stream is already at EOF, an empty string is returned. If size is specified, at most size characters will be read. Change the stream position to the given offset . Behaviour depends on the whence parameter. The default value for whence is SEEKSET . SEEKSET or 0. seek from the start of the stream (the default) offset must either be a number returned by TextIOBase. tell(). or zero. Any other offset value produces undefined behaviour. SEEKCUR or 1. 8220seek8221 to the current position offset must be zero, which is a no-operation (all other values are unsupported). SEEKEND or 2. seek to the end of the stream offset must be zero (all other values are unsupported). Return the new absolute position as an opaque number. New in version 3.1: The SEEK constants. Return the current stream position as an opaque number. The number does not usually represent a number of bytes in the underlying binary storage. Write the string s to the stream and return the number of characters written. class io. TextIOWrapper ( buffer . encodingNone . errorsNone . newlineNone . linebufferingFalse . writethroughFalse ) A buffered text stream over a BufferedIOBase binary stream. It inherits TextIOBase . encoding gives the name of the encoding that the stream will be decoded or encoded with. It defaults to locale. getpreferredencoding(False) . errors is an optional string that specifies how encoding and decoding errors are to be handled. Pass strict to raise a ValueError exception if there is an encoding error (the default of None has the same effect), or pass ignore to ignore errors. (Note that ignoring encoding errors can lead to data loss.) replace causes a replacement marker (such as ) to be inserted where there is malformed data. backslashreplace causes malformed data to be replaced by a backslashed escape sequence. When writing, xmlcharrefreplace (replace with the appropriate XML character reference) or namereplace (replace with N escape sequences) can be used. Any other error handling name that has been registered with codecs. registererror() is also valid. newline controls how line endings are handled. It can be None. . n r. and rn. It works as follows: When reading input from the stream, if newline is None. universal newlines mode is enabled. Lines in the input can end in n. r. or rn. and these are translated into n before being returned to the caller. If it is . universal newlines mode is enabled, but line endings are returned to the caller untranslated. If it has any of the other legal values, input lines are only terminated by the given string, and the line ending is returned to the caller untranslated. When writing output to the stream, if newline is None. any n characters written are translated to the system default line separator, os. linesep. If newline is or n. no translation takes place. If newline is any of the other legal values, any n characters written are translated to the given string. If linebuffering is True. flush() is implied when a call to write contains a newline character. If writethrough is True. calls to write() are guaranteed not to be buffered: any data written on the TextIOWrapper object is immediately handled to its underlying binary buffer . Changed in version 3.3: The writethrough argument has been added. Changed in version 3.3: The default encoding is now locale. getpreferredencoding(False) instead of locale. getpreferredencoding(). Don8217t change temporary the locale encoding using locale. setlocale(). use the current locale encoding instead of the user preferred encoding. TextIOWrapper provides one attribute in addition to those of TextIOBase and its parents: Whether line buffering is enabled. An in-memory stream for text IO. The text buffer is discarded when the close() method is called. The initial value of the buffer can be set by providing initialvalue . If newline translation is enabled, newlines will be encoded as if by write(). The stream is positioned at the start of the buffer. The newline argument works like that of TextIOWrapper. The default is to consider only n characters as ends of lines and to do no newline translation. If newline is set to None. newlines are written as n on all platforms, but universal newline decoding is still performed when reading. StringIO provides this method in addition to those from TextIOBase and its parents: Return a str containing the entire contents of the buffer. Newlines are decoded as if by read(). although the stream position is not changed. class io. IncrementalNewlineDecoder 16.2.4. Performance This section discusses the performance of the provided concrete IO implementations. 16.2.4.1. Binary IO By reading and writing only large chunks of data even when the user asks for a single byte, buffered IO hides any inefficiency in calling and executing the operating system8217s unbuffered IO routines. The gain depends on the OS and the kind of IO which is performed. For example, on some modern OSes such as Linux, unbuffered disk IO can be as fast as buffered IO. The bottom line, however, is that buffered IO offers predictable performance regardless of the platform and the backing device. Therefore, it is almost always preferable to use buffered IO rather than unbuffered IO for binary data. 16.2.4.2. Text IO Text IO over a binary storage (such as a file) is significantly slower than binary IO over the same storage, because it requires conversions between unicode and binary data using a character codec. This can become noticeable handling huge amounts of text data like large log files. Also, TextIOWrapper. tell() and TextIOWrapper. seek() are both quite slow due to the reconstruction algorithm used. StringIO. however, is a native in-memory unicode container and will exhibit similar speed to BytesIO . 16.2.4.3. Multi-threading FileIO objects are thread-safe to the extent that the operating system calls (such as read(2) under Unix) they wrap are thread-safe too. Binary buffered objects (instances of BufferedReader. BufferedWriter. BufferedRandom and BufferedRWPair ) protect their internal structures using a lock it is therefore safe to call them from multiple threads at once. TextIOWrapper objects are not thread-safe. 16.2.4.4. Reentrancy Binary buffered objects (instances of BufferedReader. BufferedWriter. BufferedRandom and BufferedRWPair ) are not reentrant. While reentrant calls will not happen in normal situations, they can arise from doing IO in a signal handler. If a thread tries to re-enter a buffered object which it is already accessing, a RuntimeError is raised. Note this doesn8217t prohibit a different thread from entering the buffered object. The above implicitly extends to text files, since the open() function will wrap a buffered object inside a TextIOWrapper. This includes standard streams and therefore affects the built-in function print() as well.

No comments:

Post a Comment