2016-10-18 13 views
0

Python 2.7.12でxlrdを使い始めたばかりで、何が間違っているのか分かりません。データ型の不一致のようです。Python 2.7とxlrdを使用してExcelスプレッドシート行の特定の文字列を検索する

基本的には、Excelスプレッドシート(​​.xlsx)で2列幅の一連の行の文字列を検索していますが、見つかったらその行全体を新しいスプレッドシートにコピーしたいと思います。私はこれを実行すると

スプレッドシートのデータがどのように見える...

R1: TheName_of_the_thing_XYZQ , Description of the thing with keyword1 
R1: TheName_of_another_thing_61PD , Description of the thing with keyword2 

そして、ここでは、私がこれまで持っているものだ...

import xlrd 

search_for = ['XYZQ', 'keyword2', 'foo', 'FOO'] 

book = xlrd.open_workbook('csv-test.xlsx') 
i = 0 
j = 0 

sheet1 = book.sheet_by_index(1) 

for i in range(sheet1.nrows): 
    row = sheet1.row_values(i) 
    for j in range(len(row)): 
      if row[j] == search_for: 
       print 'found it!' 
      else: 
      print 'sorry' 

は、それが中で何かを見つけることはありませんsearch_forは、すべての行について「申し訳ありません」と表示します。

私はそれが正しい文書を開き、各行などを解析することを知っています。私もcell_valueとrow_sliceを試しました。

ありがとうございます!

答えて

0

私はあなたのエラーがこれらの行であることを考える:あなたのケースでは

if row[j] == search_for: 

row[j]は、Unicode形式でセルの内容で、search_forは冒頭で宣言したリストです。言い換えれば

、あなたは例えば、このような状況を持っている:

if u'TheName_of_the_thing_XYZQ' == ['XYZQ', 'keyword2', 'foo', 'FOO']: 

と動作しません。

searc_forのリスト内のループを次のように変更して、単一のセルにリストの要素のいずれかが含まれているかどうかを確認しました。

import xlrd 
search_for = ['XYZQ', 'keyword2', 'foo', 'FOO'] 
book = xlrd.open_workbook('test.xlsx') 
sheet = book.sheet_by_index(0) 

for idx in range(sheet.nrows): 
    row = sheet.row_values(idx) 
    name = row[0] 
    description = row[1] 
    print "==== row number {} ====".format(idx + 1) 
    for key in search_for: 
     if key in name: 
      print "in 'name' column, found {}".format(name) 
     if key in description: 
      print "in 'description' column, found {}".format(name) 

私は完璧に動作

+0

、ジョルダーノを知ってみましょう!ありがとうございました!私がしなければならないことは、どちらかの列で一致が見つかった場合、その行の両方の列を別のスプレッドシートにコピーしたいということです。私はそれを理解することができると思うが、もしあなたが素早い考えを持っているなら、教えてください! –

+0

あなたを助けてうれしい! btw、Excelファイルを書くには、xlsxwriterパッケージを使うことができます。シンプルで、簡単な例やチュートリアルをオンラインで見つけることができます。 困ったときは、twitter/github(私のプロフィールを参照)で私に連絡してください。 – Giordano

関連する問題