linux اكواد - open()في Python لا يقوم بإنشاء ملف إذا لم يكن موجودًا




بايثون جاهزة (13)

open('myfile.dat', 'a') يعمل بالنسبة لي ، على ما يرام.

في py3k رفع التعليمة البرمجية الخاصة بك ValueError :

>>> open('myfile.dat', 'rw')
Traceback (most recent call last):
  File "<pyshell#34>", line 1, in <module>
    open('myfile.dat', 'rw')
ValueError: must have exactly one of read/write/append mode

في python-2.6 فإنه يثير IOError .

ما هي أفضل طريقة لفتح ملف للقراءة / الكتابة إذا كان موجودًا ، أو إذا لم يكن موجودًا ، ثم قم بإنشائه وافتحه للقراءة / الكتابة؟ من ما قرأت ، file = open('myfile.dat', 'rw') يجب أن تفعل هذا ، أليس كذلك؟

إنه لا يعمل بالنسبة لي (Python 2.6.2) وأنا أتساءل عما إذا كانت مشكلة في الإصدار ، أو ليس من المفترض أن تعمل هكذا أو ماذا.

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

UPDATE: تم كتابة الدليل المرفق من قبل المستخدم والمجموعة ، وليس غيرها (أنا على نظام لينكس ... إذن أذونات 775 بكلمات أخرى) ، وكان الخطأ الدقيق:

IOError: لا يوجد ملف أو دليل.


منذ python 3.4 يجب عليك استخدام pathlib على "لمس" الملفات.
إنه حل أكثر أناقة بكثير من الحلول المقترحة في هذا الموضوع.

from pathlib import Path

filename = Path('myfile.txt')
filename.touch(exist_ok=True)  # will create file, if it exists will do nothing
file = open(filename)

نفس الشيء مع الدلائل:

filename.mkdir(parents=True, exist_ok=True)

استعمال:

import os

f_loc = r"C:\Users\Russell\Desktop\ip_addr.txt"

if not os.path.exists(f_loc):
    open(f_loc, 'w').close()

with open(f_loc) as f:
    #Do stuff

تأكد من إغلاق الملفات بعد فتحها. with مدير السياق سيقوم بذلك نيابة عنك.


ماذا تريد أن تفعل بالملف؟ الكتابة فقط لها أو كليهما القراءة والكتابة؟

"w" ، "a" ستسمح بالكتابة وستقوم بإنشاء الملف إذا لم يكن موجودًا.

إذا كنت بحاجة إلى القراءة من ملف ، يجب أن يكون الملف موجودًا قبل فتحه. يمكنك اختبار وجودها قبل فتحها أو استخدام المحاولة / باستثناء.


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

file = open('myfile.dat', 'a+')
file.seek(0, 0)

إجابتي:

file_path = 'myfile.dat'
try:
    fp = open(file_path)
except IOError:
    # If not exists, create the file
    fp = open(file_path, 'w+')

>>> import os
>>> if os.path.exists("myfile.dat"):
...     f = file("myfile.dat", "r+")
... else:
...     f = file("myfile.dat", "w")

ص + تعني القراءة / الكتابة


من الممارسات الجيدة استخدام ما يلي:

import os

writepath = 'some/path/to/file.txt'

mode = 'a' if os.path.exists(writepath) else 'w'
with open(writepath, mode) as f:
    f.write('Hello, world!\n')

يجب عليك استخدام file = open('myfile.dat', 'w+')


ميزة الأسلوب التالي هو أن الملف مغلق بشكل صحيح في نهاية الكتلة ، حتى إذا تم رفع استثناء على الطريق. إنها تعادل try-finally ، لكن أقصر بكثير.

with open("file.dat","a+") as f:
    f.write(...)
    ...

a + يتم فتح ملف لكل من الإضافة والقراءة. يكون مؤشر الملف في نهاية الملف إذا كان الملف موجودًا. يفتح الملف في وضع الإلحاق. إذا كان الملف غير موجود ، يقوم بإنشاء ملف جديد للقراءة والكتابة. - صيغ ملفات بايثون

تسعى () طريقة يحدد الموقف الحالي للملف.

f.seek(pos [, (0|1|2)])
pos .. position of the r/w pointer
[] .. optionally
() .. one of ->
  0 .. absolute position
  1 .. relative position to current
  2 .. relative position from end

يُسمح باستخدام أحرف "rwab +" فقط ؛ يجب أن يكون هناك واحد بالضبط من "روى" - راجع مسألة تجاوز المكدس بالتفصيل سؤال صيغ ملف بايثون .


ضع w + لكتابة الملف ، أو اقتطاعه إذا كان موجودًا ، r + لقراءة الملف ، وإنشاء ملف إذا لم يكن موجودًا ولكن لا يكتب (والعودة null) أو + لإنشاء ملف جديد أو إلحاق ملف موجود.


أعتقد أنه r + وليس rw . أنا مجرد بداية ، وهذا ما رأيته في الوثائق.


التعليمة البرمجية التالية كانت أسرع بالنسبة لي من الشفرة الأخرى المنشورة هنا حتى الآن: (ملف Visual Studio 2013 ، 64 بت ، 500 ميجابايت مع طول الخط بشكل موحد في [0 ، 1000)).

const int buffer_size = 500 * 1024;  // Too large/small buffer is not good.
std::vector<char> buffer(buffer_size);
int size;
while ((size = fread(buffer.data(), sizeof(char), buffer_size, stdin)) > 0) {
    line_count += count_if(buffer.begin(), buffer.begin() + size, [](char ch) { return ch == '\n'; });
}

يدق كل محاولات بايثون أكثر من عامل 2.







python linux file-io file-permissions