إنشاء ملف محدد بمسافة في بايثون
-
13-12-2019 - |
سؤال
باستخدام الكود أدناه، أحصل على المعلومات الصحيحة للملف - نوعًا ما.إليك الكود:
filename = raw_input('What would you like to name the file? ')
import csv
data = [frames]
out = csv.writer(open(filename,"w"), delimiter=' ',quoting=csv.QUOTE_MINIMAL)
out.writerows(data)
يؤدي هذا إلى إنشاء شيء يشبه هذا في ملف نصي:
"[255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0]" "[ 0 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171
171 171]"
أود أن تبدو المعلومات كما يلي:
255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 []0 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
يمثل القوسان حرفًا يشير إلى صف جديد من المعلومات.إنه مستطيل صغير في محرر النصوص الخاص بي ولست متأكدًا من ماهية الحرف.
إذًا، كيف يمكنني التخلص من علامات الاقتباس والأقواس واستخدام هذه الشخصية الأخرى؟
يحرر:
لقد حاولت استخدام الكود أدناه وحصلت على الخطأ التالي:
Traceback (most recent call last):
File "(stdin)", line 1, in (module)
File "backandforth3.py", line 154, in (module)
out.write(' '.join(frame))
Type Error: sequence item 0: expect string, numpy.int32 found
المحلول
أفترض أنك تستخدم برنامج "المفكرة" كمحرر للنصوص؟خطوط جديدة على نمط يونكس (\n
) تظهر كمربعات في برنامج "المفكرة" لأنها تدعم الخطوط الجديدة لنظام التشغيل Windows فقط (\r\n
).ومع ذلك، يجب أن يوفر هذا الإخراج الذي تتوقعه:
filename = raw_input('What would you like to name the file? ')
with open(filename, 'wb') as out:
for frame in frames:
out.write(' '.join(str(num) for num in frame))
out.write('\r\n')
ليس هناك سبب للالتفاف frames
وفي قائمة أخرى؛بافتراض أن المتغير عبارة عن قائمة من قوائم الأرقام، كما يشير الناتج المتوقع، يجب أن يعمل هذا بشكل جيد.
أيضًا، إذا كان من الضروري أن يكون لديك "المربعات" التي وصفتها في الإخراج، فاستبدلها '\r\n'
مع '\n'
.
نصائح أخرى
لو frames
هي مصفوفة numpy مما يمكنك استخدامه numpy.savetxt()
وظيفة:
numpy.savetxt(filename, frames)
لإصلاح الخاص بك csv
كود فتح الملف في الوضع الثنائي wb
لتجنب إتلاف نهاية السطور، ولا تلتف frames
في قائمة أخرى يبدو أنها مصفوفة ثنائية الأبعاد بالفعل:
import csv
with open(filename,"wb") as f:
writer = csv.writer(f, delimiter=' ', quoting=csv.QUOTE_MINIMAL)
writer.writerows(frames)