0

こんにちは、Python でのコーディングは初めてです。csv を解析して、適切な電話番号と不適切な電話番号を分離しようとしています。これが私がこれまでに持っているものです。次のエラーが表示されます: * AttributeError: 'list' object has no attribute 'state' * これを修正する方法を教えてください。クラスが定義されていないことはわかっていますが、他にデータを分離する方法がわかりません。

# Description: cleans phone number field and returns fields that need manual edits
# Date Modified: 10/22/13

#Working on making two separate files...good and bad phone.

import csv
import string
import time
import re
import pprint
import codecs
start_time = time.time()

# remove all non-numeric characters from phone numbers
all=string.maketrans('','')
nodigs=all.translate(all, string.digits + string.ascii_letters + " ")
nospace=all.translate(all, string.digits + string.ascii_letters)    

def main():
    # creates new file to dump clean data
    fout = codecs.open('clean_phone.csv', 'w', 'latin-1')
    writer = csv.writer(fout)


    #Create dictionary for easy reading/location
    office_list= ['Office Phone']
    alt_list= ['Alternative Phone']
    fax_list= ['Fax']

    # Creates boolean to allow for delegation into good/bad csv files 
    state = True

    # Begin parsing Office Phone
    with codecs.open('companies.csv', 'r', 'latin-1') as f:
        reader = csv.reader(f)
        headers = reader.next()
        id_index=headers.index("ID")
        office_phone_index=headers.index("Office Phone")
        alt_phone_index=office_phone_index + 1
        fax_index=office_phone_index + 2
        condensed_header = [headers[id_index], headers[office_phone_index], headers[alt_phone_index], headers[fax_index]]
        writer.writerow(condensed_header)

        i=2
        for row in reader:

            # Clean Office Phone
            phoneNumber= row[office_phone_index]
            goodNumber=phoneNumber.translate(all, nodigs)
            if len(goodNumber)>12:
                numberParts= goodNumber.rpartition("%x")
                if numberParts[0]:
                    goodNumber=numberParts[0]
                else:
                    state = False
                    office_list.append("row %d: %s" %(i, goodNumber))            
            row[office_phone_index]=goodNumber.translate(all, nospace)

            # Clean Alternate Phone
            phoneNumber2= row[alt_phone_index]
            goodNumber2=phoneNumber2.translate(all, nodigs)
            if len(goodNumber2)>12:
                numberParts2= goodNumber2.rpartition("%x")
                if numberParts2[0]:
                    goodNumber2=numberParts2[0]
                else:
                    state = False
                    alt_list.append("row %d: %s" %(i, goodNumber2))
            row[alt_phone_index]=goodNumber2.translate(all, nospace)

            # Clean FAX
            phoneNumber3= row[fax_index]
            goodNumber3=phoneNumber3.translate(all, nodigs)
            if len(goodNumber3)>12:
                numberParts3= goodNumber3.rpartition("%x")
                if numberParts3[0]:
                    goodNumber3=numberParts[0]
                else:
                    state = False
                    fax_list.append("row %d: %s" %(i, goodNumber3))
            row[fax_index]=goodNumber3.translate(all, nospace)

            # Write Row (write to a good or bad list)
            condensed_row = [row[id_index],row[office_phone_index], row[alt_phone_index], row[fax_index]]

            #Bad Phone List
            if office_list.state == False:
                fout = codecs.open('manual_office_phone_fix.csv', 'w', 'latin-1')
                writer.writerow(condensed_row)
            if alt_phone_list.state == False:
                fout = codecs.open('manual_alt_phone_fix.csv', 'w', 'latin-1')
                writer.writerow(condensed_row)
            if fax_list.state == False:
                fout = codecs.open('manual_fax_phone_fix.csv', 'w', 'latin-1')
                writer.writerow(condensed_row)  
            #Good Phone List for Manual Edit
            else:
                writer.writerow(condensed_row)
            #Move to next item
            i+=1    

        #Print Results to the Console
        print "The following phone numbers need manual review." + "\n"
        pprint.pprint(office_list)
        pprint.pprint(alt_list)
        pprint.pprint(fax_list)
    fout.close()
main()
4

3 に答える 3

0

あなたがするとき

if office_list.state == False:

stateの属性であることを探していますがoffice_list、そうではありません。上記のいくつかの場所でstate同等に設定した場所がわかりますfalse。3 つの異なる変数を作成し、それらを if ステートメントで使用することをお勧めします。A office_list_statealt_phone_list_state、および a でfax_list_stateあり、それらをブール値として使用します。if ブロックに到達したときに値があることを確認する必要があるため、初期値をTrue. コードを注意深く調べて、そこで何が必要かを知りませんでした。

于 2013-10-22T20:41:43.973 に答える
0

StackOverflow へようこそ!

いくつかの異なるフィールドの状態を追跡する必要があるようです。辞書は試しましたか?ループの先頭に次のようなものがあります。

states = {'office_phone': True,
          'alt_phone': True,
          'fax': True} 

そして、例えば をstate = False行うのではなく、 を行います。states['office_phone'] = False状態を確認したい場合は を行ってくださいif states['office_phone']:

それが役立つことを願っています。ハッピーコーディング!

于 2013-10-22T20:41:45.350 に答える
0

それがまさにここで起こっていることです:

if office_list.state == False

次のように定義され.stateたインスタンスを呼び出していますlist

office_list= ['Office Phone']

メソッドを持たないものstate。さらに、メソッドもoffice_list持たない文字列が含まれているようです。.state

.state基本的な間違いを犯したのに気付いていない/発見していないか、そもそも構文が何を意味するのかを理解せずに何か「魔法」が自動的に起こることを期待しているようです。state呼び出されるのは、実際にブール値を保持する変数だけですstateが、リストのメソッドとしてアクセスできるようになりました。なぜそうなると思ったのかわかりません。

リストごとに 1 つずつ、3 つの異なる状態を保持する必要がある場合は、state_officealt_state呼ばれる 3 つの異なる状態変数を使用しfax_state、代わりにそれらにアクセスします。また、何が起こっているのかを理解せずに魔法のようなことをしようとしないでください。Python が意図したとおりに動作することを期待してください。

于 2013-10-22T20:41:50.160 に答える