用于操作excel表的python脚本

时间:2012-08-03 17:45:54

标签: python excel

我正在尝试编写一个python脚本来操作excel电子表格。

假设是,我是否有样本数据:

Gene        chrom    strand  TSS        TES         Name

NM_145215   chr5     +       135485168  135488045   Abhd11

NM_1190437  chr5     +       135485021  135488045   Abhd11

NM_1205181  chr14    +       54873803   54888844    Abhd4

NM_134076   chr14    +       54878906   54888844    Abhd4

NM_9594     chr2     +       31615464   31659747    Abl1

NM_1112703  chr2     +       31544075   31659747    Abl1

NM_207624   chr11    +       105829258  105851278   Abl1

NM_9598     chr11    +       105836521  105851278   Ace2

NM_1130513  chrX     +       160577273  160626350   Ace2

NM_27286    chrX     +       160578411  160626350   Ace2

对于那些相似的名称(第6列),我想检索具有最少TSS的整行。 例如,对于前两行-Abhd11名称,我想在结果中保存第二行,因为TSS 135485021< 135485168.等等所有具有相同名称的集合。

任何想法和评论都表示赞赏。

4 个答案:

答案 0 :(得分:4)

输入

如果可能的话,我会将excel文件保存为csv文件,然后使用csv module加载到python中。

或者你可以使用xlrd module for reading excel files - 虽然我没有使用过这个但对它不太了解。

openpyxl是解析excel文件的另一个选项(欢呼另一个笨蛋)。

<强>操纵

ernie的想法似乎可行,我将按如下方式实施。 假设linesreadfromfile是使用csv.reader读取的列表列表,即每个列表元素是与文件中该行的分隔条目对应的值列表,

finaldict = {}
for row in linesreadfromfile:
    if finaldict.has_key(row[5]):
        if finaldict[row[5]][3] > row[3]:
            finaldict[row[5]] = row
    else:
        finaldict[row[5]] = row

答案 1 :(得分:2)

我同意mutzmatron并会推荐xlrd模块。这是一个简单的例子:

import xlrd

# Create your file handle
file_handle = xlrd.open_workbook(file_name)

# Use the first page in the spreadsheet (0-based indexes)
sheet = file_handle.sheet_by_index(0)

# Create dictionary for storing values
abc = {}

# Loop through every row
for i in range(sheet.nrows):
  line = sheet.row_values(i)

  # Get your 'Name' and 'TSS' columns
  name = line[5]
  tss = line[3]

  # Add this 'Name' to your dictionary if it's new, or keep the max value
  if name not in abc.keys():
    abc[name] = tss
  else:
    abc[name] = max(abc[name],tss)

显然根据您的规格更改了您需要保存的内容(完整行,某些值等)。

---编辑---

  # If this 'Name' is new, save this line
  if name not in abc.keys():
    abc[name] = {'tss': tss, 'line': line}

  # Else, if this 'Name' is not new and the TSS is less, keep this new line
  elif tss < abc[name]['tss']:
    abc[name]['line'] = line

答案 2 :(得分:0)

您可以使用IronSpread为您提供python控制台以及在python中编写此类操作的方法。它还支持可以作为普通excel函数使用的UDF,这很不错。

答案 3 :(得分:0)

您可以使用Python Tool for Visual Studio团队提供的Pyvot。它提供了一个全面的API,用于处理CPython中的Excel电子表格。

您可以从PyPi获取代码:http://pypi.python.org/pypi/Pyvot 您可以从Pytools网站获取文档:http://pytools.codeplex.com/wikipage?title=Pyvot