python - مشاريع - مكتبة اكواد بايثون




في Python ، كيف أقرأ ملفًا سطرًا تلو الآخر في قائمة؟ (20)

قراءة وكتابة الملفات النصية مع بيثون 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

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

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


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

#!/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

إذا كنت ترغب في قراءة ملف من سطر الأوامر أو من stdin ، فيمكنك أيضًا استخدام وحدة fileinput :

# reader.py
import fileinput

content = []
for line in fileinput.input():
    content.append(line.strip())

fileinput.close()

تمرير الملفات إليه مثل:

$ python reader.py textfile.txt 

اقرأ المزيد هنا: http://docs.python.org/2/library/fileinput.html


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

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

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

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

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

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")

استخدم هذا:

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() .


انظر المدخلات و Ouput :

with open('filename') as f:
    lines = f.readlines()

أو مع تجريد حرف السطر الجديد:

lines = [line.rstrip('\n') for line in open('filename')]

ملاحظة المحرر: الأمر الأصلي line.strip() تجريد line.strip() ، line.strip() ، كما يدل عليه تعليق يانوس ترويلسن ، سيؤدي إلى إزالة جميع المسافات البادئة واللاحقة ، وليس فقط اللاحقة \n .


خيار آخر هو numpy.genfromtxt ، على سبيل المثال:

import numpy as np
data = np.genfromtxt("yourfile.dat",delimiter="\n")

سيؤدي ذلك إلى جعل data مصفوفة NumPy مع عدد الصفوف الموجودة في ملفك.


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

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

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

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 بشكل صحيح.


لقراءة ملف إلى قائمة تحتاج إلى القيام بأشياء ثلاثة:

  • افتح الملف
  • قراءة الملف
  • قم بتخزين المحتويات كقائمة

لحسن الحظ ، فإن Python تجعل من السهل جدًا القيام بهذه الأشياء ، لذا فإن أقصر طريقة لقراءة ملف إلى قائمة هي:

lst = list(open(filename))

ومع ذلك سأضيف بعض مزيد من الشرح.

فتح الملف

أفترض أنك تريد فتح ملف معين ولا تتعامل مباشرة مع مقبض ملف (أو مقبض شبيه بالملفات). إن الوظيفة الأكثر استخدامًا لفتح ملف في Python open ، وتستغرق حجة واحدة إلزامية وأخرى اختيارية في Python 2.7:

  • اسم الملف
  • الوضع
  • التخزين المؤقت (سأتجاهل هذه الوسيطة في هذا الجواب)

يجب أن يكون اسم الملف عبارة عن سلسلة تمثل المسار إلى الملف . فمثلا:

open('afile')   # opens the file named afile in the current working directory
open('adir/afile')            # relative path (relative to the current working directory)
open('C:/users/aname/afile')  # absolute path (windows)
open('/usr/local/afile')      # absolute path (linux)

لاحظ أنه يجب تحديد ملحق الملف. هذا مهم بشكل خاص لمستخدمي ويندوز لأن امتدادات الملفات مثل .txt أو .doc ، الخ تكون مخفية بشكل افتراضي عند عرضها في المستكشف.

الوسيطة الثانية هي mode ، وهي r بشكل افتراضي والتي تعني "للقراءة فقط". هذا هو بالضبط ما تحتاجه في قضيتك.

ولكن في حال كنت تريد بالفعل إنشاء ملف و / أو الكتابة إلى ملف ستحتاج إلى حجة مختلفة هنا. هناك إجابة ممتازة إذا كنت تريد نظرة عامة .

لقراءة ملف ، يمكنك تجاهل mode أو تمريره بشكل صريح:

open(filename)
open(filename, 'r')

كلاهما سيفتح الملف في وضع القراءة فقط. إذا كنت ترغب في قراءة ملف ثنائي على نظام Windows ، فيجب استخدام وضع rb :

open(filename, 'rb')

على المنصات الأخرى يتم تجاهل 'b' (الوضع الثنائي) بكل بساطة.

الآن بعد أن عرضت كيفية open الملف ، دعنا نتحدث عن حقيقة أنك تحتاج دائمًا close مرة أخرى. وإلا فسيحتفظ بملف ملف مفتوح إلى الملف حتى تنتهي العملية (أو يقوم بايثون بحمل مقبض الملف).

في حين يمكنك استخدام:

f = open(filename)
# ... do stuff with f
f.close()

سيخفق ذلك في إغلاق الملف عندما يحدث شيء ما بين open close استثناء. يمكنك تجنب ذلك باستخدام try finally :

f = open(filename)
# nothing in between!
try:
    # do stuff with f
finally:
    f.close()

ومع ذلك ، فإن Python توفر مديري السياق الذين لديهم بنية أكثر جمالية (ولكن على سبيل open فهي مطابقة تقريبًا try finally ):

with open(filename) as f:
    # do stuff with f
# The file is always closed after the with-scope ends.

النهج الأخير هو النهج الموصى به لفتح ملف في بايثون!

قراءة الملف

حسنًا ، لقد فتحت الملف ، والآن كيف أقرأه؟

ترجع الدالة open كائن file وتدعم بروتوكول التكرار Pythons. سيعطيك كل تكرار سطرًا:

with open(filename) as f:
    for line in f:
        print(line)

هذا سوف يطبع كل سطر من الملف. لاحظ مع ذلك أن كل سطر سيحتوي على حرف السطر الجديد \n في النهاية (قد ترغب في التحقق مما إذا كان بيثون مبنيًا بدعم عالمي جديد - وإلا قد يكون لديك أيضًا \r\n على Windows أو \r على Mac كخطوط جديدة) . إذا لم تكن ترغب في ذلك ، يمكنك ببساطة إزالة آخر حرف (أو آخر حرفين على Windows):

with open(filename) as f:
    for line in f:
        print(line[:-1])

لكن الخط الأخير لا يحتوي بالضرورة على سطر جديد لاحق ، لذا لا ينبغي على المرء استخدام ذلك. يمكن للمرء أن يتحقق مما إذا كان ينتهي بآخر جديد ، وإذا كان كذلك ، فقم بإزالته:

with open(filename) as f:
    for line in f:
        if line.endswith('\n'):
            line = line[:-1]
        print(line)

ولكن يمكنك ببساطة إزالة جميع المسافات البيضاء (بما في ذلك الحرف \n ) من نهاية السلسلة ، وسيؤدي ذلك أيضًا إلى إزالة جميع المسافات البيضاء الزائدة الأخرى حتى يكون عليك توخي الحذر إذا كانت هذه العناصر مهمة:

with open(filename) as f:
    for line in f:
        print(f.rstrip())

ومع ذلك ، إذا كانت الخطوط تنتهي بـ \r\n (Windows "newlines") فإن ذلك .rstrip() أيضًا بـ \r !

قم بتخزين المحتويات كقائمة

الآن بعد أن عرفت كيفية فتح الملف وقراءته ، حان الوقت لتخزين المحتويات في قائمة. سيكون أبسط خيار هو استخدام وظيفة list :

with open(filename) as f:
    lst = list(f)

إذا كنت تريد تجريد الخطوط الجديدة الزائدة ، يمكنك استخدام الفهم بالقائمة بدلاً من ذلك:

with open(filename) as f:
    lst = [line.rstrip() for line in f]

أو حتى أبسط: تقوم طريقة .readlines() لكائن file بشكل افتراضي بإرجاع list الأسطر:

with open(filename) as f:
    lst = f.readlines()

سيتضمن ذلك أيضًا أحرف السطر الجديد الزائدة ، إذا لم تكن ترغب في ذلك ، فإنني أوصي [line.rstrip() for line in f] لأنه يتجنب الاحتفاظ بقائمتين تحتويان على جميع الأسطر في الذاكرة.

هناك خيار إضافي للحصول على الإخراج المطلوب ، على الرغم من أنه بالأحرى "دون المستوى الأمثل": قم read الملف الكامل في سلسلة ثم تقسيم على خطوط جديدة:

with open(filename) as f:
    lst = f.read().split('\n')

أو:

with open(filename) as f:
    lst = f.read().splitlines()

يعتني هذا بالخطوط الجديدة الزائدة تلقائيًا نظرًا لعدم تضمين الحرف split . ومع ذلك فهي ليست مثالية لأنك تحتفظ بالملف كسلسلة وكقائمة من الخطوط في الذاكرة!

ملخص

  • استخدم with open(...) as f عند فتح الملفات لأنك لست بحاجة إلى الاعتناء بإغلاق الملف بنفسك وإغلاق الملف حتى في حالة حدوث بعض الاستثناءات.
  • تدعم كائنات file بروتوكول التكرار ، لذا فإن قراءة ملف خط تلو الآخر هي بسيطة مثل for line in the_file_object:
  • اﺳﺘﻌﺮض اﻟﻮﺛﺎﺋﻖ ﻟﻠﺪات / اﻟﻔﺼﻮل اﻟﻤﺘﺎﺣﺔ داﺋﻤًﺎ. معظم الوقت هناك تطابق مثالي للمهمة أو على الأقل واحد أو اثنين جيد. سيكون الخيار الواضح في هذه الحالة هو readlines() ولكن إذا كنت ترغب في معالجة الخطوط قبل تخزينها في القائمة ، أوصي بفهم بسيط للقائمة.

مجرد استخدام وظائف splitlines (). هنا مثال.

inp = "file.txt"
data = open(inp)
dat = data.read()
lst = dat.splitlines()
print lst
# print(lst) # for python 3

في الإخراج سيكون لديك قائمة الخطوط.


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

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

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

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

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


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

lines = open(filePath).readlines()

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

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 كممارسة بالنسبة لك).

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


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

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

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

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

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

طريقة نظيفة و Pythonic من قراءة خطوط ملف في قائمة

أولاً وقبل كل شيء ، يجب أن تركز على فتح ملفك وقراءة محتوياته بطريقة فعالة ومنطقية. في ما يلي مثال للطريقة التي لا أفضّل بها شخصيًا:

infile = open('my_file.txt', 'r')  # Open the file for reading.

data = infile.read()  # Read the contents of the file.

infile.close()  # Close the file since we're done using it.

بدلاً من ذلك ، أفضل الطريقة أدناه لفتح الملفات لكل من القراءة والكتابة لأنها نظيفة جدًا ، ولا تتطلب خطوة إضافية لإغلاق الملف بمجرد انتهائك من استخدامه. في البيان أدناه ، نفتح الملف للقراءة ، وسنقوم بتعيينه للمتغير "infile". بمجرد انتهاء تشغيل التعليمة البرمجية الموجودة في هذا البيان ، سيتم إغلاق الملف تلقائيًا.

# Open the file for reading.
with open('my_file.txt', 'r') as infile:

    data = infile.read()  # Read the contents of the file into memory.

الآن نحن بحاجة إلى التركيز على إدخال هذه البيانات في قائمة بايثون لأنها قابلة للتكرار وفعالة ومرنة. في حالتك ، الهدف المرغوب هو إحضار كل سطر من الملف النصي إلى عنصر منفصل. لإنجاز هذا ، سنستخدم طريقة splitlines () كما يلي:

# Return a list of the lines, breaking at line boundaries.
my_list = data.splitlines()

المنتج النهائي:

# Open the file for reading.
with open('my_file.txt', 'r') as infile:

    data = infile.read()  # Read the contents of the file into memory.

# Return a list of the lines, breaking at line boundaries.
my_list = data.splitlines()

اختبار كودنا:

  • محتويات الملف النصي:
     A fost odatã ca-n povesti,
     A fost ca niciodatã,
     Din rude mãri împãrãtesti,
     O prea frumoasã fatã.
  • بيانات الطباعة لأغراض الاختبار:
    print my_list  # Print the list.

    # Print each line in the list.
    for line in my_list:
        print line

    # Print the fourth element in this list.
    print my_list[3]
  • الإخراج (مختلفة المظهر بسبب أحرف unicode):
     ['A fost odat\xc3\xa3 ca-n povesti,', 'A fost ca niciodat\xc3\xa3,',
     'Din rude m\xc3\xa3ri \xc3\xaemp\xc3\xa3r\xc3\xa3testi,', 'O prea
     frumoas\xc3\xa3 fat\xc3\xa3.']

     A fost odatã ca-n povesti, A fost ca niciodatã, Din rude mãri
     împãrãtesti, O prea frumoasã fatã.

     O prea frumoasã fatã.

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

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 وليس صفيف.





readlines