在使用python的excel中,如何从包含多个单词的单元格的整列中找到单词?

问题描述:

我有一个的关键词在列A在使用python的excel中,如何从包含多个单词的单元格的整列中找到单词?

eg. Bob 
    Dan 
    Brian 

在B列列表的Excel文件,我有在小区多个条目的几行:

B1= Bob, Grant, James, Dave 
B2= Dean, Dan, Brian 

我怎么了投入C列,并且是在A列名和细胞B. 即我想的输出继电器是:

C1= Bob 
C2= Dan, Brian 

任何想法?我曾尝试使用Python,但不知道如何开始。

帮助将不胜感激

+2

你有什么试过? 这可能是一个开始的地方:http://packages.python.org/openpyxl/ – deadly 2012-08-13 12:24:32

+0

@gene onyx:你没有评论我的答案或在这里,你找到了答案?如果是这样,你可以关闭这个问题吗? – 2012-08-13 13:56:36

+0

感谢上述链接致命。这么多一次采取一切。 – Onyx 2012-08-14 09:20:38

它首先取决于您用来访问Excel的Python模块。如果您使用的是Windows,我会推荐使用可以找到的Win32Com here.该模块提供对任何Microsoft Office应用程序(包括Excel)的Python编程访问,并使用许多与VBA中使用的方法相同的方法。

下面是使用Win32Com for Excel解决您的问题的方法。我假设您使用逗号(',')作为名称之间的分隔符,并且列A和列B之间的名称匹配区分大小写(请记住,在Python中,“A”不等于“a”)

开始,我们希望与你们的名字

#First we need to access the module that lets us connect to Excel 
import win32com.client 

# Next we want to create a variable that represents Excel 
app = win32com.client.Dispatch("Excel.Application") 

# Lastly we will assume that the sheet with the names is the active sheet 
sheet = app.ActiveSheet 

连接到Excel和获得访问表在这一点上,我们有一个变量命名表示积极练成工作表与名称。您只需点击任何单元格即可激活工作表。现在我们首先获得列A中的所有名称并将其存储到列表中。我们有这样做的两个选项:

  1. 我们可以遍历所有单元格的列A,并提取名称保存为一个字符串,并将其追加到使用sheet.Cells所有名的列表(行,COL).value的。这适用于较小的范围,但如果您处理的行数超过500行,则速度可能会变慢。
  2. 我们可以使用sheet.Range(“A1”,“A3”)。Value提取列A中包含名称的整个单元格范围,并将值添加到列表中。如果你有大量的单元格,这可以更快。对于这个例子,我们将使用Range。

例续:

import win32com.client 
app = win32com.client.Dispatch("Excel.Application") 
sheet = app.ActiveSheet 

# rang is an object representing the cells A1, A2, A3 
rang = sheet.Range("A1","A3") 

# names is a tuple of length 3 containing tuples of length 2 
names = rang.Value 

#nameLst is a list of all values in names 
nameLst = [name[0] for name in names] 

接下来我们要遍历所有B列的名字为此,我们将使用sheet.Cells.Value函数获取Col B中每个单元格的名称列表。我们还将使用string.split(“,”)函数将逗号分隔的名称拆分为一个名称列表和string.strip()来删除任何不必要的空格。如果有任何此列表中的名字都是在nameLst,我们知道我们有一个比赛,并把它放在上校C.

import win32com.client 
app = win32com.client.Dispatch("Excel.Application") 
sheet = app.ActiveSheet 

rang = sheet.Range("A1","A3") 
names = rang.Value 
nameLst = [name[0] for name in names] 

#Iterate over the rows ic ColB. Remember Excel uses base 1 not 0 for inexing 
for rowI in range(1,3): 
    cellNames = sheet.Cells(rowI,2).Value 

    #split cellNames by "," and add all of the names to a list. 
    cellNamesLst = [cellName.strip() for cellName in cellNames.split(",")] 

    #Now we want a list of all names that are in cellNamesLst and in nameLst 
    matchLst = [matchName for matchName in cellNamesLst if matchName in nameLst] 

    #Create a string of all matches to go in Col C 
    allMatches = ", ".join(matchLst) 

    #Lastly put all matches in in Col C 
    sheet.Cells(rowI,3).Value = allMatches 

这将将会把字符串“鲍勃”到单元格C1和“丹,布赖恩“进入单元格C2。 win32com的使用非常强大,可以用来自动执行你在所有MS Office应用程序中所做的大部分工作。

这里是最后的代码W/O评论:

import win32com.client 
app = win32com.client.Dispatch("Excel.Application") 
sheet = app.ActiveSheet 

rang = sheet.Range("A1","A3") 
names = rang.Value 
nameLst = [name[0] for name in names] 

for rowI in range(1,3): 
    cellNames = sheet.Cells(rowI,2).Value 
    cellNamesLst = [cellName.strip() for cellName in cellNames.split(",")] 
    matchLst = [matchName for matchName in cellNamesLst if matchName in nameLst] 
    allMatches = ", ".join(matchLst) 
    sheet.Cells(rowI,3).Value = allMatches 

希望这有助于。

+0

谢谢迈克尔。这工作绝对好吃!?!最重要的是感谢新手指导通过一步一步的解释。 – Onyx 2012-08-14 10:27:04

+0

Onyx没问题。我记得当我开始使用Python for Excel,PowerPoint,Word和Access时,很难将所有信息放在一起。如果您有任何问题,请随时向我发送消息,我可以看到我可以提供什么帮助。 – 2012-08-14 18:25:42

我看到它时,“列”和他们的“细胞”,是简单的罗列。

#the "columns" 

A = ["Bob","Dan","Brian"] 
B = [["Bob", "Grant", "James", "Dave"],\ 
    ["Dean", "Dan", "Brian"]] 
C = [] 


for b in B: 
    c = [] 
    for name in b: 
     if name in A: 
      c.append(name) 
    C.append(c) 

for c in C: 
    print c 

>>> 
['Bob'] 
['Dan', 'Brian'] 

所有你需要做的就是将每列读到一个列表。对于A列,只需将这些项目附加为名称列表。而列B只是将每个单元格作为自己的列表附加到主列表中。

那里你有它。

+0

Doh,它看起来很简单。当我走了那不是那样的。 – Onyx 2012-08-14 09:10:45

+0

@Onyx多数民众赞成python,它可以是非常简单的,如果你想它。另外 - 你甚至不需要特殊的Excel读取器,只需读取文件并拆分行即可获取每种列的类型。如果你想我可以添加到我的答案,如果你有麻烦。 – 2012-08-14 10:36:40