سؤال

[يرجى ملاحظة أن هذا هو سؤال مختلف من أجبت كيفية استبدال العمود باستخدام بايثون المدمج في .csv الكاتب الوحدة ؟ ]

انا اريد عمل بحث واستبدال (خاص عمود واحد من عناوين url) في ضخمة Excel .ملف csv.منذ أنا في بداية مراحل أحاول تعليم نفسي لغة البرمجة فكرت في محاولة لتنفيذ الحل في بيثون.

أواجه مشكلة عند محاولة الكتابة مرة أخرى إلى .ملف csv بعد إجراء تغيير على محتويات إدخال.لقد قرأت الرسمية csv وثائق وحدة حول كيفية استخدام الكاتب ، ولكن ليس هناك مثال أن يغطي هذه الحالة.على وجه التحديد, أنا أحاول الحصول على قراءة وإحلال عمليات الكتابة إنجازه في حلقة واحدة.بيد أنه لا يمكن استخدام نفس صف المرجعية في كل حلقة حجة و المعلمة الكاتب.writerow().لذا عندما صنعت التغيير في حلقة, كيف لي أن أكتب مرة أخرى إلى الملف ؟

تحرير: لقد نفذت اقتراحات من S.لوت و "جيمي" لا تزال نفس النتيجة

تحرير #2: وأضاف لي "rb" و "البنك الدولي" إلى فتح() وظائف في S.لوت اقتراح

import csv

#filename = 'C:/Documents and Settings/username/My Documents/PALTemplateData.xls'

csvfile = open("PALTemplateData.csv","rb")
csvout = open("PALTemplateDataOUT.csv","wb")
reader = csv.reader(csvfile)
writer = csv.writer(csvout)

changed = 0;

for row in reader:
    row[-1] = row[-1].replace('/?', '?')
    writer.writerow(row)                  #this is the line that's causing issues
    changed=changed+1

print('Total URLs changed:', changed)

تحرير: للمرجع الخاص بك, هذا هو جديد كامل traceback من المترجم:

Traceback (most recent call last):
  File "C:\Documents and Settings\g41092\My Documents\palScript.py", line 13, in <module>
    for row in reader:
_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)
هل كانت مفيدة؟

المحلول

لا يمكنك قراءة وكتابة نفس الملف.

source = open("PALTemplateData.csv","rb")
reader = csv.reader(source , dialect)

target = open("AnotherFile.csv","wb")
writer = csv.writer(target , dialect)

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


تحرير

في خطوط

source = open("PALTemplateData.csv","rb")

target = open("AnotherFile.csv","wb")

و "م ع" و "البنك الدولي" هل المطلوب تماما.في كل مرة كنت تجاهل تلك ، يمكنك فتح الملف للقراءة في تنسيق خاطئ.

يجب استخدام "rb" قراءة .ملف CSV.لا يوجد خيار آخر مع بيثون 2.x.مع بيثون 3.x, يمكنك حذف هذا ، ولكن استخدام "r" صراحة لجعلها واضحة.

يجب استخدام "البنك الدولي" إلى كتابة .ملف CSV.لا يوجد خيار آخر مع بيثون 2.x.مع بيثون 3.× يجب استخدام "w".


تحرير

يبدو أنك تستخدم Python3.سوف تحتاج إلى إسقاط "ب" من "rb" و "البنك الدولي".

قراءة هذا: http://docs.python.org/3.0/library/functions.html#open

نصائح أخرى

فتح ملفات csv الثنائية هو مجرد خطأ.CSV هي نص عادي الملفات لذلك عليك أن تفتح لهم

source = open("PALTemplateData.csv","r")
target = open("AnotherFile.csv","w")

الخطأ

_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)

يأتي لأنك فتحها في الوضع الثنائي.

عندما كنت أفتح excel csv مع بيثون ، كنت تستخدم شيئا مثل:

try:    # checking if file exists
    f = csv.reader(open(filepath, "r", encoding="cp1250"), delimiter=";", quotechar='"')
except IOError:
    f = []

for record in f:
    # do something with record

وعملت بدلا من ذلك بسرعة (لقد تم افتتاح اثنين عن 10MB كل ملفات csv, على الرغم من أنني فعلت هذا مع بيثون 2.6 ليس الإصدار 3.0).

هناك عدد قليل من العامل وحدات العمل مع excel csv الملفات من داخل الثعبان - pyExcelerator هو واحد منهم.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top