2016-10-10 36 views
0

xlrdを使用して、Excelシートから列を抽出してリストにしました。Python:文字列のリストから文字列の一部を削除する

from xlrd import open_workbook 
book = xlrd.open_workbook("HEENT.xlsx").sheet_by_index(0) 
med_name = [] 
for row in sheet.col(2): 
    med_name.append(row) 
med_school = [] 
for row in sheet.col(3): 
    med_school.append(row) 
print(med_school) 

以下はリストのスニペットです:med_school。

[text:'University of San Francisco', 
text: 'Harvard University', 
text:'Class of 2016, University of Maryland School of Medicine', 
text:'Class of 2015, Johns Hopkins University School of Medicine', 
text:'Class of 2014, Raymond and Ruth Perelman School of Medicine at the 
University of Pennsylvania'] 

リスト内の各文字列から「text: 'Class of 2014」を削除します。私はリストの理解を試みましたが、属性エラーがあります。 'Cell'オブジェクトには属性 'strip'がありません。授業の年と「テキスト」という単語がない医学部の名前を持つ医学部の名前のリストを作成する方法を知っている人はいますか?

+4

このサンプルリストの出力に何か問題があります。おそらく、テキストのような余分な引用符があることがあります: 'Class of ...' ''?おそらくあなたがまだ作成していない場合は、あなたの出力からここにコピー/貼り付け*することもできます。 – jwd

+0

** textの前に二重引用符がありません**と、各行の最後にはありますか? – Prune

+0

リストの出力に何も問題はありません。これは単に 'xlrd.Cell'インスタンスが' __repr__'を実装する方法です – donkopotamus

答えて

1

各文字列の先頭を切り捨てるには、指定した区切り文字を使用します。最初に「クラス」があることを確認してください。コンマスペースがあることがわかります。

med_school = ["text:'Class of 2016, University of Maryland School of Medicine'", 
       "text:'Class of 2015, Johns Hopkins University School of Medicine'", 
       "text:'Class of 2014, Raymond and Ruth Perelman School of Medicine at the University of Pennsylvania'", 
       "text:'Class of 1989, Rush Medical School/Knox College'", 
       "text:'Bernie\'s Back-Alley School of Black-Market Techniques'" 
      ] 

school_name = [] 
for first in med_school: 
    name = first.value 
    if ", " in name: 
     cut = name.index(", ") 
     name = name[cut+2:] 
    else: 
     name = name[6:-1] 
    school_name.append(name) 

print school_name 

出力(余分なラインでは、読みやすさを向上させるためにフィード):

["University of Maryland School of Medicine'", 
"Johns Hopkins University School of Medicine'", 
"Raymond and Ruth Perelman School of Medicine at the University of Pennsylvania'" 
"Rush Medical School/Knox College'", 
"Bernie's Back-Alley School of Black-Market Techniques"] 

また、リストの内包にループをラップすることができます:

school_name = [name.value[name.value.index(", ")+2:] \ 
         if ", " in name \ 
         else name[6:-1] \ 
        for name in med_school] 
+0

私もこのソリューションを試してみましたが、属性エラーがあります。 'Cell'オブジェクトに 'index'属性がありません –

+0

右。これはcell.value ... editingで動作する必要があります。 – Prune

+0

私は両方のソリューションを試しましたが、 "substring not found"という値のエラーが発生しました。 "name.value.index("、 "))の行にエラーが発生します –

4

xlrdはあなたの文字列を返しません。 Cellというクラスのインスタンスを返します。これはあなたが見ている文字列を含むプロパティvalueを持っています。これは、最初の15文字( "2014年のクラスを、")を削除します

for cell in med_school: 
    cell.value = cell.value[:15] 

:単純にこれらを変更するには

。あるいは、文字列分割( "、")や正規表現のような他の方法を使うこともできます。

ここで重要な点は、med_schoolsのリストの値を直接操作するのではなく、その.valueプロパティの値を直接操作することです。または、それをあなたがそれに取り組むことができる他の場所に抽出する。例えば

、接頭辞を落とし、テキストプロパティのすべてを取得するには:

values = [cell.value[15:] for cell in med_schools] 

それとも、問題のあるデータ

values = [re.sub(r"^Class of \d{4}, ", "", cell.value) for cell in med_schools] 
+0

私は最初の2つのソリューションを試しましたが、属性エラーが発生しました。 'Cell'オブジェクトに属性 'text'がありません –

+0

'.text'から' .value'に変更します – donkopotamus

+0

ありがとうございました!私のコードが働いた。このドキュメントへのリンクはありますか?私の値の中には "Class of 201"がないものがあるので、値が "Class of 201"のときに最初の15文字だけを削除するif文の構文を探しています。 –

1

変更を含むactuallingのみを交換するために交換するために正規表現を使用してfor row in sheet.col(2)for row in sheet.col(2).valueになります。
Uはdoファイルの種類を取り除き、実際の値を取得します

関連する問題