วิธีอ่านไฟล์ทีละบรรทัดใน Julia


18

ฉันจะเปิดไฟล์ข้อความและอ่านทีละบรรทัดได้อย่างไร มีสองกรณีที่ฉันสนใจในคำตอบสำหรับ:

  1. รับบรรทัดทั้งหมดในอาร์เรย์พร้อมกัน
  2. ประมวลผลทีละบรรทัด

สำหรับกรณีที่สองฉันไม่ต้องการเก็บทุกบรรทัดไว้ในหน่วยความจำในคราวเดียว

คำตอบ:


25

การอ่านไฟล์ในหน่วยความจำทั้งหมดในครั้งเดียวเนื่องจากอาเรย์ของเส้นเป็นเพียงการเรียกใช้readlinesฟังก์ชัน:

julia> words = readlines("/usr/share/dict/words")
235886-element Array{String,1}:
 "A"
 "a"
 "aa"
 
 "zythum"
 "Zyzomys"
 "Zyzzogeton"

โดยค่าเริ่มต้นสิ่งนี้จะยกเลิกการขึ้นบรรทัดใหม่ แต่หากคุณต้องการเก็บไว้คุณสามารถส่งต่ออาร์กิวเมนต์คำหลักkeep=true:

julia> words = readlines("/usr/share/dict/words", keep=true)
235886-element Array{String,1}:
 "A\n"
 "a\n"
 "aa\n"
 
 "zythum\n"
 "Zyzomys\n"
 "Zyzzogeton\n"

หากคุณมีวัตถุไฟล์ที่เปิดอยู่แล้วคุณสามารถส่งต่อไปยังreadlinesฟังก์ชันได้:

julia> open("/usr/share/dict/words") do io
           readline(io) # throw out the first line
           readlines(io)
       end
235885-element Array{String,1}:
 "a"
 "aa"
 "aal"
 
 "zythum"
 "Zyzomys"
 "Zyzzogeton"

นี่แสดงให้เห็นถึงreadlineฟังก์ชั่นที่อ่านหนึ่งบรรทัดจากออบเจ็กต์ I / O ที่เปิดหรือเมื่อได้รับชื่อไฟล์ให้เปิดไฟล์และอ่านบรรทัดแรกจากมัน:

julia> readline("/usr/share/dict/words")
"A"

หากคุณไม่ต้องการโหลดเนื้อหาไฟล์ทั้งหมดในครั้งเดียว (หรือหากคุณกำลังประมวลผลข้อมูลสตรีมมิ่งจากซ็อกเก็ตเครือข่าย) คุณสามารถใช้eachlineฟังก์ชั่นเพื่อรับตัววนซ้ำที่สร้างบรรทัดหนึ่งครั้ง:

julia> for word in eachline("/usr/share/dict/words")
           if length(word) >= 24
               println(word)
           end
       end
formaldehydesulphoxylate
pathologicopsychological
scientificophilosophical
tetraiodophenolphthalein
thyroparathyroidectomize

eachlineฟังก์ชั่นสามารถเช่นเดียวกับreadlinesยังได้รับการจับไฟล์ที่เปิดอ่านบรรทัดจาก นอกจากนี้คุณยังสามารถ "วนreadlineทวนของคุณเอง" โดยการเปิดไฟล์และโทรซ้ำ ๆ :

julia> open("/usr/share/dict/words") do io
           while !eof(io)
               word = readline(io)
               if length(word) >= 24
                   println(word)
               end
           end
       end
formaldehydesulphoxylate
pathologicopsychological
scientificophilosophical
tetraiodophenolphthalein
thyroparathyroidectomize

นี่เทียบเท่ากับสิ่งที่eachlineทำกับคุณและมันยากที่จะทำเช่นนี้ด้วยตัวคุณเอง แต่ถ้าคุณต้องการความสามารถก็อยู่ตรงนั้น สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการอ่านอักขระไฟล์โดยอักขระดูคำถามและคำตอบนี้: เราจะใช้ julia เพื่ออ่านอักขระแต่ละตัวของไฟล์. txt ทีละตัวได้อย่างไร

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.