string الدوال - في Python ، كيف أقرأ ملفًا سطرًا تلو الآخر في قائمة؟




بايثون مكتبة (25)

كيف أقرأ كل سطر لملف في بايثون ، وخزن كل سطر كعنصر في قائمة؟

أرغب في قراءة ملف السطر سطرًا وإلحاق كل سطر بنهاية القائمة.


Answers

قراءة وكتابة الملفات النصية مع بيثون 2 + 3 ؛ يعمل مع يونيكود

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# Define data
lines = ['     A first string  ',
         'A unicode sample: €',
         'German: äöüß']

# Write text file
with open('file.txt', 'w') as fp:
    fp.write('\n'.join(lines))

# Read text file
with open('file.txt', 'r') as fp:
    read_lines = fp.readlines()
    read_lines = [line.rstrip('\n') for line in read_lines]

print(lines == read_lines)

أشياء يجب ملاحظتها:

  • with ما يسمى مدير السياق . تأكد من أن الملف المفتوح مغلق مرة أخرى.
  • جميع الحلول هنا والتي تجعل ببساطة .strip() أو .rstrip() ستفشل في إعادة إنتاج lines كما أنها تجرد المساحة البيضاء.

نهايات الملف الشائعة

.txt

أكثر تقدما كتابة الملف / القراءة

  • CSV: تنسيق بسيط للغاية ( القراءة والكتابة )
  • JSON: لطيفة لكتابة البيانات التي يمكن قراءتها. شائع الاستخدام ( قراءة وكتابة )
  • YAML: YAML مجموعة شاملة من JSON ، ولكن أسهل في القراءة ( القراءة والكتابة والمقارنة بين JSON و YAML )
  • مخلل: صيغة تسلسل Python ( قراءة وكتابة )
  • MessagePack ( حزمة Python ): تمثيل مضغوط أكثر ( قراءة وكتابة )
  • HDF5 ( حزمة بايثون ): لطيفة للمصفوفات ( اقرأ وكتابة )
  • XML: موجود أيضًا * تنهد * ( read write )

بالنسبة إلى طلبك ، قد يكون ما يلي مهمًا:

  • دعم لغات البرمجة الأخرى
  • القراءة / كتابة الأداء
  • Compactness (حجم الملف)

انظر أيضًا: مقارنة تنسيقات بيانات التسلسل

في حالة البحث عن طريقة لإنشاء ملفات التكوين ، قد ترغب في قراءة ملفات تهيئة المقالة القصيرة في Python


هذا يجب أن يغلف الأمر المفتوح.

array = []
with open("file.txt", "r") as f:
  for line in f:
    array.append(line)

طريقة سهلة حقيقية:

with open(file) as g:
    stuff = g.readlines()

إذا كنت ترغب في جعله برنامجًا مكتملًا ، فاكتب هذا في:

file = raw_input ("Enter EXACT file name: ")
with open(file) as g:
    stuff = g.readlines()
print (stuff)
exit = raw_input("Press enter when you are done.")

لسبب ما ، فإنه لا يقرأ ملفات .py بشكل صحيح.


سأفعلها هكذا

lines = []
with open("myfile.txt") as f:
    for line in f:
        lines.append(line)

يمكنك ببساطة القيام بما يلي ، كما هو مقترح:

with open('/your/path/file') as f:
    my_lines = f.readlines()

لاحظ أن هذا النهج يحتوي على سلبيتين:

1) يمكنك تخزين كافة الخطوط في الذاكرة. في الحالة العامة ، هذه فكرة سيئة للغاية. قد يكون الملف كبيرًا جدًا ، ويمكنك نفاده من الذاكرة. حتى لو لم يكن كبيرًا ، فهو ببساطة مضيعة للذاكرة.

2) هذا لا يسمح بمعالجة كل سطر أثناء قراءته. لذلك إذا قمت بمعالجة خطوطك بعد هذا ، فهي غير فعالة (تتطلب مرورين بدلاً من واحد).

نهج أفضل للحالة العامة سيكون على النحو التالي:

with open('/your/path/file') as f:
    for line in f:
        process(line)

حيث يمكنك تحديد وظيفة العملية الخاصة بك بالطريقة التي تريدها. فمثلا:

def process(line):
    if 'save the world' in line.lower():
         superman.save_the_world()

(يتم ترك تطبيق فئة Superman كممارسة بالنسبة لك).

هذا سيعمل بشكل جيد لأي حجم ملف وأنت تمر ملفك في مرور واحد فقط. هذا هو عادة كيف ستعمل محللات عامة.


يمكنك القيام بذلك بسهولة عن طريق الكود التالي:

lines = open(filePath).readlines()

أحب استخدام ما يلي. قراءة الخطوط على الفور.

contents = []
for line in open(filepath, 'r').readlines():
    contents.append(line.strip())

أو باستخدام فهم القائمة:

contents = [line.strip() for line in open(filepath, 'r').readlines()]

وهنا خيار واحد أكثر باستخدام قائمة الفهم على الملفات ؛

lines = [line.rstrip() for line in open('file.txt')]

يجب أن تكون هذه الطريقة أكثر فعالية حيث يتم معظم العمل داخل مترجم Python.


f = open("your_file.txt",'r')
out = f.readlines() # will append in the list out

الآن متغير خارج قائمة (مجموعة) من ما تريد. يمكنك القيام إما:

for line in out:
    print line

أو

for line in f:
    print line

ستحصل على نفس النتائج.


إصدار سطر الأوامر

#!/bin/python3
import os
import sys
abspath = os.path.abspath(__file__)
dname = os.path.dirname(abspath)
filename = dname + sys.argv[1]
arr = open(filename).read().split("\n") 
print(arr)

إركض مع:

python3 somefile.py input_file_name.txt

استخدم هذا:

import pandas as pd
data = pd.read_csv(filename) # You can also add parameters such as header, sep, etc.
array = data.values

data هي نوع dataframe ، ويستخدم القيم للحصول على ndarray. يمكنك أيضًا الحصول على قائمة باستخدام array.tolist() .


يمكن أيضا استخدام الأمر loadtxt في numpy. هذا يتحقق لشروط أقل من genfromtxt لذلك قد يكون أسرع.

import numpy 
data = numpy.loadtxt(filename,delimiter="\n")

إذا كنت لا تهتم بإغلاق الملف ، تعمل هذه البطانة الواحدة:

lines = open('file.txt').read().split("\n")

الطريقة التقليدية :

fp = open('file.txt') # open file on read mode
lines = fp.read().split("\n") # create a list containing all lines
fp.close() # close file

باستخدام with (مستحسن):

with open('file.txt') as fp:
    lines = fp.read().split("\n")

البيانات في القائمة

افترض أن لدينا ملفًا نصيًا يحتوي على بياناتنا كما في السطور التالية:

محتوى ملف نصي:

   line 1
   line 2
   line 3
  1. افتح cmd في نفس dir (انقر بزر الماوس الأيمن واختر cmd أو powershell)
  2. تشغيل python وفي المترجم الكتابة:

نص بيثون

>>> with open("myfile.txt", encoding="utf-8") as file:
...     x = [l.strip() for l in file]
>>> x
['line 1','line 2','line 3']

باستخدام اللاحقه

x = []
with open("myfile.txt") as file:
    for l in file:
        x.append(l.strip())

أو...

>>> x = open("myfile.txt").read().splitlines()
>>> x
['line 1','line 2','line 3']

أو...

>>> y = [x.rstrip() for x in open("my_file.txt")]
>>> y
['line 1','line 2','line 3']

الحصول على نص من صفحة ويب مع python 3

هنا هناك مثال تقريبي لنص انتزع من الشبكة. تحتوي الصفحة على نص عادي ، نحتاج إلى تنظيفه من \ n \ r و b 'الأحرف جاهزة للطباعة.

  • تحويل البيانات من بايت إلى السلسلة
  • إنشاء قائمة سلسلة بواسطة تقسيم كل سطر جديد
  • قم بتنظيف كل عنصر من عناصر البند \ n \ r و b ، إلى جانب أي شيء آخر يقلل من إمكانية قراءة النص.

الشفرة:

from urllib.request import urlopen
# I grab the text into this variable with urlopen and the read() method
testo = urlopen("https://www.gutenberg.org/files/11/11.txt").read()
# then I split the text at each newline, transforming the strin in a list
testo = str(testo).split("\\n")
# now I show some lines, from 30 to 48, replacing some stuffs
for l in testo[30:48]:
    print(l.replace("\\r","").replace("\\'","\'").replace("b'",""))

انتاج:

مغامرات أليس في العجائب

لويس كارول

THE MILLENNIUM FULCRUM EDITION 3.0

الفصل الأول. أسفل حفرة الأرنب

بدأت أليس بالتعب الشديد من الجلوس على يد أختها على البنك ، ولم يكن لديها ما تفعله: فقد مررت مرة واحدة أو مرتين في الكتاب الذي كانت أخته تقرأه ، ولكن لم يكن لديها صور أو محادثات في ذلك ، هو استخدام كتاب ، "فكرت أليس" بدون صور أو محادثات؟


with open(fname) as fo:
        data=fo.read().replace('\n', ' ').replace (',', ' ')

وهذا ينبغي أن أجيب على سؤالك. تعمل وظيفة الاستبدال كمحدد لتجريد الملف.


lines = list(open("dict.lst", "r"))
linesSanitized = map(lambda each:each.strip("\n"), lines)
print linesSanitized

هذا هو أكثر وضوحا من الضروري ، ولكن يفعل ما تريد.

with open("file.txt", "r") as ins:
    array = []
    for line in ins:
        array.append(line)

إذا كنت تريد \n تضمين:

with open(fname) as f:
    content = f.readlines()

إذا كنت لا تريد \n تضمين:

with open(fname) as f:
    content = f.read().splitlines()

سيؤدي هذا إلى "صفيف" من الأسطر من الملف.

lines = tuple(open(filename, 'r'))

with open(fname) as f:
    content = f.readlines()
# you may also want to remove whitespace characters like `\n` at the end of each line
content = [x.strip() for x in content] 

أنا أعتقد أنك تعني list وليس صفيف.


أبسط طريقة للقيام بذلك

طريقة بسيطة هي:

  1. قراءة الملف بأكمله كسلسلة
  2. تقسيم خط السلسلة عن طريق الخط

في سطر واحد ، من شأنه أن يعطي:

lines = open('C:/path/file.txt').read().splitlines()

على حد علمي لا تملك بايثون بنية بيانات صفيف محلية. ولكنه يدعم بنية بيانات القائمة التي هي أبسط بكثير في الاستخدام من صفيف.

array = [] #declaring a list with name '**array**'
with open(PATH,'r') as reader :
    for line in reader :
        array.append(line)

يمكنك فقط فتح ملفك للقراءة باستخدام

file1 = open("filename","r")
# and for reading use
lines = file1.readlines()
file1.close()

ستحتوي أسطر القائمة على جميع الخطوط الخاصة بك كعناصر فردية ويمكنك استدعاء عنصر محدد باستخدام lines["linenumber-1"] حيث يبدأ python حسابه من 0.


إذا كنت تريد مواجهة ملف كبير جدًا / ضخم وتريد القراءة بشكل أسرع (تخيل أنك في مسابقة ترميز Topcoder / Hackerrank) ، قد تقرأ جزءًا كبيرًا من الخطوط إلى مخزن مؤقت للذاكرة في وقت واحد ، بدلاً من فقط قم بتكرار السطر سطر على مستوى الملف.

buffersize = 2**16
with open(path) as f: 
    while True:
        lines_buffer = f.readlines(buffersize)
        if not lines_buffer:
            break
        for line in lines_buffer:
            process(line)

إذا كانت قيمك أعداد صحيحة ، وكنت تستخدم Python 2.7 أو أحدث ، فيمكنك استخدام collections.Counterبدلاً من dict. و most_commonسوف طريقة أعطيك كل البنود، مرتبة حسب القيمة.





python string file readlines