2016-11-22 16:16:42 u013345628 阅读数 1247

import httplib
import urllib
import base64
import sys
import ssl
ssl._create_default_https_context = ssl._create_unverified_context


def emotion():
    # print "success"
    headers = {
        'Content-Type': 'application/octet-stream',
        'Ocp-Apim-Subscription-Key': '6b106d11b891490298ebecbc1f99eb85', }
##确定使用类型是json还是stream,输入密钥
    params = urllib.urlencode(
        {"url": "https://api.projectoxford.ai/emotion/v1.0/recognize"})
##输入Request URL,urlencode函数,可以把key-value这样的键值对转换成我们想要的格式,返回的是a=1&b=2这样的字符串
    f = urllib.urlopen("http://127.0.0.1:8090/?action=snapshot")
    s = f.read()
    w = open("snapshot.jpg", "wb")
    w.write(s)
##将图片传给定地址,'wb'是以二进制写入(原文档没有给出127.0.0.1这个地址,此处为猜测)
    fp = open("snapshot.jpg", "rb")
##'rb'即为用二进制打开文件
    fp.seek(0, 0)
##进行此操作后读取文件的指针仍在开头,seek(offset,whence=0)offset:开始的偏移量,也就是代表需要移动偏移的字节数whence:给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。默认为0。
    d = []
##定义列表d并把最重最终获得的二进制代码传到d中
    d = fp.read()
##进行文件的读写操作,最终目的是为了获得{body},即d
    try:
        conn = httplib.HTTPSConnection('api.projectoxford.ai')
        conn.request("POST", "/emotion/v1.0/recognize?%s" % params, d, headers)
##将一系列的头,需要的URL,检测的图片的二进制代码post到微软网站
        response = conn.getresponse()
        data = response.read()
        print(data)
        conn.close()
##获取的微软API返回的参数并储存到data中
    except Exception as e:
        print("[Errno {0}] {1}".format(e.errno, e.strerror))
##如果发生错误的话就输出错误类型
    data = eval(data)
##利用eval函数可以把返回的字符串转换为python能够识别的列表形式
    num = len(data)
##计算列表元素,而非字符串个数
    ret = []
    for i in range(0, num):
        ret.append(sorted(data[i]["scores"],reverse=True,key=lambda x: data[i]["scores"][x])[0])
    ret = str(ret)
##对其进行sorted排序,最终只返回最大的那个,建立ret列表,重新转换为字符串,sorted排序:data为列表可迭代对象,reverse控制降序排列,key写了一个匿名函数确定了排序的规则,最后[0]限定了只添加第一个即为最大的那个元素
    return ret


2017-12-17 00:00:00 zV3e189oS5c0tSknrBCL 阅读数 1918

参考来源:

http://www.oschina.net/news/91595/python-as-an-official-scripting-language-to-excel


微软正考虑将 Python 作为 Excel 官方脚本语言之一,在 Excel 用户反馈平台中,「Python 作为 Excel 的脚本语言」成为了最热议的话题,是排名第二的提议的两倍多



目前为止,超过 3883 人赞同将 Python 集成到 Excel 中,成为 VBA 替代品,甚至像单元格函数 functions (=SUM(A1:A2)) 也可以用 Python 函数 sum(a1, a2) 来代替


目前微软官方已经作出积极回应,通过发起投票来收集更多用户的反馈信息,在线调查用户想要如何在 Excel 中使用 Python 。

如果该项提议得到批准,Excel 用户将能够使用 Python 脚本与 Excel 的核心功能进行交互,类似于 Excel 当前支持 VBA 脚本一样。

对这个消息,但也有人指出如果微软走这条路线,那么也需要在所有其它 Office 应用程序中支持 Python,保证产品的一致性。

如果你也赞同这项提议,不妨去该平台支持一下,点击「阅读原文」投票支持。


推荐阅读:


关注Python之禅,学点Python

2017-08-05 21:53:59 qq_20183489 阅读数 5765

本文介绍用Python简单读取*.docx文件信息,一些python-word库就是对这种方法的扩展。

介绍分两部分:

  • Word(*.docx)文件简述
  • Python提取Word信息

Word(*.docx)文件简述

大约在2008年以前,Office产品中Word用.doc文件格式,这种二进制格式很难与其他软件兼容。
为了跟上时代,微软采用类XML格式标准定义其新版Word文件.docx。
.docx实际上是一个zip的压缩文件,比如我们有一个test.docx的文件:
这里写图片描述
其内容如下:
这里写图片描述
改变其后缀名为test.zip,然后解压,会得到如下文件:
这里写图片描述
其中Word文件的正文内容被保持在word/document.xml中,我们可以打开查看:
这里写图片描述

Python提取Word信息

根据Word(.docx)文件格式,我们遵循如下步骤进行正文信息的提取:
1 解压.docx文件
2 用BeautifulSoup解析word/document.xml提取正文信息

具体代码如下:

from zipfile import ZipFile
from bs4 import BeautifulSoup

document=ZipFile('test.docx')
xml=document.read("word/document.xml")
wordObj=BeautifulSoup(xml.decode("utf-8"))
texts=wordObj.findAll("w:t")
for text in texts:
    print(text.text)
2018-12-12 11:00:52 stone0823 阅读数 2562

微软 Office 提供基于 COM 接口的编程。Python 通过 pywin32 可以方便地调用各组件。如果下载和安装 pywin32 有困难,可以到 Sourceforge 的镜像网摘查找合适的版本。

单一账号

import win32com.client as win32

def send_mail():
    outlook = win32.Dispatch('Outlook.Application')

    mail_item = outlook.CreateItem(0) # 0: olMailItem

    mail_item.Recipients.Add('someone@qq.com')
    mail_item.Subject = 'Mail Test'

    mail_item.BodyFormat = 2          # 2: Html format
    mail_item.HTMLBody  = '''
        <H2>Hello, This is a test mail.</H2>
        Hello Guys. 
        '''
    mail_item.Send()

if __name__ == '__main__':
    send_mail()

多账号发送邮件

如果 Outlook 有多个账号,需要选择账号发送邮件,需要在代码中对账号进行判断,代码如下:

def send_mail():
    outlook_app = win32.Dispatch('Outlook.Application')

    # choose sender account
    send_account = None
    for account in outlook_app.Session.Accounts:
        if account.DisplayName == 'sender@hotmail.com':
            send_account = account
            break

    mail_item = outlook_app.CreateItem(0)   # 0: olMailItem

    # mail_item.SendUsingAccount = send_account not working
    # the following statement performs the function instead
    mail_item._oleobj_.Invoke(*(64209, 0, 8, 0, send_account))

    mail_item.Recipients.Add('receipient@qq.com')
    mail_item.Subject = 'Test sending using particular account'
    mail_item.BodyFormat = 2   # 2: Html format
    mail_item.HTMLBody = '''
        <H2>Hello, This is a test mail.</H2>
        Hello Guys. 
        '''

    mail_item.Send()


if __name__ == '__main__':
    send_mail()

这里有点黑魔法,直接设置 mail_item.SendUsingAccount 不会起作用,返回值是 None, 永远从第一个邮箱账号发送邮件,我使用的是 Office 365 版。需要调用 _oleobj_.Invoke() 方法。后面列出了参考链接。

本质上,这种方法是调用 COM 组件,可以查询微软的开发帮助了解相关对象的属性和方法,比如我想知道 Account 的细节,就特意参考了下面这篇帮助:https://docs.microsoft.com/zh-cn/office/vba/api/outlook.account 。COM 编程与语言无关。另外可以在 Outlook 中 ALT + F11,进入 VBE 环境,然后 F2 进入对象浏览器界面查看比如下面的界面显示了 Account 的属性和方法:

关于调试

python 作为动态语言,通过 Debug 获取 COM 对象信息并不是很方便,比如下面代码:

import win32com.client as win32

def print_outlook_accounts():
    outlook_app = win32.Dispatch('Outlook.Application')

    for account in outlook_app.Session.Accounts:
        print (account.DeliveryStore.DisplayName)

if __name__ == '__main__':
    send_mail()

设置断点的调试界面:

我们只知道 account 是一个 COM Object,account 包含的信息很多都是 unknown 的。碰到这种情况,我一般用 C# 或者 VBA 编写代码进行调试。如果我需要详细了解 account 的属性和方法,在 Office 的任何组件中,比如 Excel,写一段下面的代码:

Public Sub Print_Outlook_Accounts()

    ' 工具 -> 引用:添加 Microsoft Outook Object Library 引用
    
    Dim outlookApp As New Outlook.Application
    Dim accounts As Outlook.accounts
    
    Set accounts = outlookApp.Session.accounts
    
    Dim account As Outlook.account
    For Each account In accounts
        Debug.Print account.DisplayName
    Next
End Sub

显示出监视窗口,设置断点,获取 accounts 信息:

在监视窗口添加变量 accounts:

展开:


Item 1 和 Item 2 表示有两个账号,现在我们想看到 Item 2 的账号信息,将 Item 2 展开:


DeliveryStore 属性也包含 account 的信息,可以展开查看。

参考

2019-08-25 12:52:03 gdjlc 阅读数 182

python-docx库可用于创建和编辑Microsoft Word(.docx)文件。
官方文档:https://python-docx.readthedocs.io/en/latest/index.html

备注:
doc是微软的专有的文件格式,docx是Microsoft Office2007之后版本使用,其基于Office Open XML标准的压缩文件格式,比 
doc文件所占用空间更小。docx格式的文件本质上是一个ZIP文件,所以其实也可以把.docx文件直接改成.zip,解压后,里面的 
word/document.xml包含了Word文档的大部分内容,图片文件则保存在word/media里面。
python-docx不支持.doc文件,间接解决方法是在代码里面先把.doc转为.docx。


一、安装包

pip3 install python-docx

二、创建word文档

下面是在官文示例基础上对个别地方稍微修改,并加上函数的使用说明

from docx import Document
from docx.shared import Inches

document = Document()

#添加标题,并设置级别,范围:0 至 9,默认为1
document.add_heading('Document Title', 0)

#添加段落,文本可以包含制表符(\t)、换行符(\n)或回车符(\r)等
p = document.add_paragraph('A plain paragraph having some ')
#在段落后面追加文本,并可设置样式
p.add_run('bold').bold = True
p.add_run(' and some ')
p.add_run('italic.').italic = True

document.add_heading('Heading, level 1', level=1)
document.add_paragraph('Intense quote', style='Intense Quote')

#添加项目列表(前面一个小圆点)
document.add_paragraph(
    'first item in unordered list', style='List Bullet'
)
document.add_paragraph('second item in unordered list', style='List Bullet')

#添加项目列表(前面数字)
document.add_paragraph('first item in ordered list', style='List Number')
document.add_paragraph('second item in ordered list', style='List Number')

#添加图片
document.add_picture('monty-truth.png', width=Inches(1.25))

records = (
    (3, '101', 'Spam'),
    (7, '422', 'Eggs'),
    (4, '631', 'Spam, spam, eggs, and spam')
)

#添加表格:一行三列
# 表格样式参数可选:
# Normal Table
# Table Grid
# Light Shading、 Light Shading Accent 1 至 Light Shading Accent 6
# Light List、Light List Accent 1 至 Light List Accent 6
# Light Grid、Light Grid Accent 1 至 Light Grid Accent 6
# 太多了其它省略...
table = document.add_table(rows=1, cols=3, style='Light Shading Accent 2')
#获取第一行的单元格列表
hdr_cells = table.rows[0].cells
#下面三行设置上面第一行的三个单元格的文本值
hdr_cells[0].text = 'Qty'
hdr_cells[1].text = 'Id'
hdr_cells[2].text = 'Desc'
for qty, id, desc in records:
    #表格添加行,并返回行所在的单元格列表
    row_cells = table.add_row().cells
    row_cells[0].text = str(qty)
    row_cells[1].text = id
    row_cells[2].text = desc

document.add_page_break()

#保存.docx文档
document.save('demo.docx')

创建的demo.docx内容如下:

三、读取word文档

from docx import Document

doc = Document('demo.docx')

#每一段的内容
for para in doc.paragraphs:
    print(para.text)

#每一段的编号、内容
for i in range(len(doc.paragraphs)):
    print(str(i),  doc.paragraphs[i].text)

#表格
tbs = doc.tables
for tb in tbs:
    #行
    for row in tb.rows:    
        #列    
        for cell in row.cells:
            print(cell.text)
            #也可以用下面方法
            '''text = ''
            for p in cell.paragraphs:
                text += p.text
            print(text)'''

运行结果:

Document Title
A plain paragraph having some bold and some italic.
Heading, level 1
Intense quote
first item in unordered list
second item in unordered list
first item in ordered list
second item in ordered list
Document Title
A plain paragraph having some bold and some italic.
Heading, level 1
Intense quote
first item in unordered list
second item in unordered list
first item in ordered list
second item in ordered list



Qty
Id
Desc
101
Spam
422
Eggs
631
Spam, spam, eggs, and spam
[Finished in 0.2s]

python版xor解密源码

阅读数 3876

没有更多推荐了,返回首页