Инфраструктура Python. Источники данных

Архивы

todo Python поддерживает чтение некоторых типов архивов (https://docs.python.org/2/library/archiving.html)

todo Нужен отчет по ФС (особенно по либе), какие встречаются архивы

zlib.decompress(s)

with zipfile.ZipFile(fn) as z:
    for info in z.infolist:
        print info.filename, info.file_size, z.read(info.filename)[:100]

zlib
gzip
bz2
zipfile
tarfile

`backports.lzma` для .xz и .lzma | pylzma
libarchive -- Windows?
rarfile
https://github.com/harvimt/pylib7zip
bz2file
lz4
python-lzo
Brotli | brotlipy
zopfli | zopflipy | pyzopfli
mpyq is a Python library for reading MPQ (MoPaQ) archives used in many of Blizzard's games

Документы: pdf djvu doc rtf chm docx xls xlsx odt

Архивы либгена по популярности: rar zip gz exe/SFX ha iso 7z bz2 nrg ace arj isz tar msi daa mdf

todo Как читать контейнеры виртуальных машин, образы дисков, iso?

Форматы обмена данными

JSON

В веб повсеместно используется JSON, похожий на литералы в JavaScript.

In [115]:
import json
print json.loads('{"u":[1,2,3]}')
print json.dumps([1,3,5,'abc',{'o':True}])
{u'u': [1, 2, 3]}
[1, 3, 5, "abc", {"o": true}]

XML

Устарел, но еще встречается (например, в формате fb2) XML. Для работы с ним подходит встроенная библиотека lxml. Одним из удобных способов искать что-нибудь в XML (как во всем документе, так и в отдельном узле) являются селекторы XPath.

In [103]:
from lxml import etree
xml = '''\
<description id="125">
  <title-info>
   <genre>child_sf</genre>
   <author>
    <first-name>Сергей</first-name>
    <last-name>Другаль</last-name>
   </author>
   <book-title>Тигр проводит вас до гаража</book-title>
  </title-info>
</description>
'''
doc = etree.XML(xml)
print doc, doc.tag, doc.attrib, doc.items(), doc.keys(), doc.values(), doc.get('id')
print doc.xpath('/description/title-info/genre/text()')
for c in doc.xpath('//author')[0].getchildren():
    print c.tag, c.text
print etree.tostring(doc.xpath('//author')[0])
<Element description at 0x2136d208> description {'id': '125'} [('id', '125')] ['id'] ['125'] 125
['child_sf']
first-name Сергей
last-name Другаль
<author>
    <first-name>&#1057;&#1077;&#1088;&#1075;&#1077;&#1081;</first-name>
    <last-name>&#1044;&#1088;&#1091;&#1075;&#1072;&#1083;&#1100;</last-name>
   </author>
   
In [476]:
for info in doc.findall('title-info'):
    for genre in info.findall('genre'):
        print genre.text
child_sf
In [492]:
parser = etree.XMLParser(recover=True)
tree = etree.fromstring('<root><a></a><b></b></rot>', parser)
parser.error_log
Out[492]:
<string>:1:29:FATAL:PARSER:ERR_TAG_NAME_MISMATCH: Opening and ending tag mismatch: root line 1 and rot

Библиотека lxml содержит и менее требовательный к памяти на больших XML SAX-парсер, генерирующий эвенты в процессе разбора.

In [108]:
import lxml
list(lxml.etree.iterparse(BytesIO(xml)))
Out[108]:
[('end', <Element genre at 0x2137c988>),
 ('end', <Element first-name at 0x2137ce08>),
 ('end', <Element last-name at 0x2137cac8>),
 ('end', <Element author at 0x2137c908>),
 ('end', <Element book-title at 0x2137c788>),
 ('end', <Element title-info at 0x2137c608>),
 ('end', <Element description at 0x2137ca48>)]

С небольшим XML может быть удобнее работать в стиле библиотеки json, для этого есть библиотека xmltodict

pip install xmltodict
In [54]:
import xmltodict
dic = xmltodict.parse(xml)
print dic
print dic['description']['title-info']['author']['last-name']
OrderedDict([(u'description', OrderedDict([(u'@id', u'125'), (u'title-info', OrderedDict([(u'genre', u'child_sf'), (u'author', OrderedDict([(u'first-name', u'\u0421\u0435\u0440\u0433\u0435\u0439'), (u'last-name', u'\u0414\u0440\u0443\u0433\u0430\u043b\u044c')])), (u'book-title', u'\u0422\u0438\u0433\u0440 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442 \u0432\u0430\u0441 \u0434\u043e \u0433\u0430\u0440\u0430\u0436\u0430')]))]))])
Другаль

Впрочем, использовать ее следует с осторожностью

In [59]:
parsed = xmltodict.parse('<a><b>1</b>2<b>3</b></a>')
print parsed
print
print xmltodict.unparse(parsed)
OrderedDict([(u'a', OrderedDict([(u'b', [u'1', u'3']), ('#text', u'2')]))])

<?xml version="1.0" encoding="utf-8"?>
<a><b>1</b><b>3</b>2</a>

HTML

HTML похож на XML, с которым они имеют общего предшественника, так что для парсинга HTML можно использовать ту же библиотеку lxml. Оттуда же пришли селекторы CSS, иногда позволяющие записать выборку короче.

In [65]:
html = '<a href="#">Hello, <b class="bootstrap red">HTML</b> of evil</a>, you are rocks'
doc = etree.HTML(html)
print doc
print
print etree.tostring(doc)
print
etree.dump(doc)
print
print doc.cssselect('.red'), repr(doc.cssselect('.red')[0].tail)
a = doc.cssselect('a')[0]
print repr(a.text), repr(a.tail)
<Element html at 0x1f5ef0c8>

<html><body><a href="#">Hello, <b class="bootstrap red">HTML</b> of evil</a>, you are rocks</body></html>

<html>
  <body><a href="#">Hello, <b class="bootstrap red">HTML</b> of evil</a>, you are rocks</body>
</html>

[<Element b at 0x1f5ef148>] ' of evil'
'Hello, ' ', you are rocks'

Pickle

Почти все Python-объекты могут быть сериализованы в формат pickle. Но он плохо подходит для передачи данных, потому что зависит от версии Python и позволяет исполнять код при загрузке.

todo Интероп pickle (2<->3, x32-x64, или лучше dill? pickleshare?), bson? cPickle? objloader?

The pickle library often fails for complex functions including lambdas, closures, and class methods. When this occurs we recommend the alternative serialization library dill.

альтернативы pickle: marshmallow, dill, и pyro

In [50]:
import pickle
from collections import OrderedDict
from numpy import nan
In [6]:
data = OrderedDict([((1,2,3), {'a': {1, 2, 3}, 'b': nan, 'c': []})])
serialized = pickle.dumps(data)
serialized
Out[6]:
"ccollections\nOrderedDict\np0\n((lp1\n(lp2\n(I1\nI2\nI3\ntp3\na(dp4\nS'a'\np5\nc__builtin__\nset\np6\n((lp7\nI1\naI2\naI3\natp8\nRp9\nsS'c'\np10\n(lp11\nsS'b'\np12\nFnan\nsaatp13\nRp14\n."
In [7]:
pickle.loads(serialized)
Out[7]:
OrderedDict([((1, 2, 3), {'a': {1, 2, 3}, 'b': nan, 'c': []})])

С просмотром и анализом файла, сгенерированного pickle, может помочь встроенная библиотека pickletools

In [1]:
import pickletools
In [11]:
print len(serialized), len(pickletools.optimize(serialized))
158 108
In [12]:
pickletools.dis(pickletools.optimize(serialized))
    0: c    GLOBAL     'collections OrderedDict'
   25: (    MARK
   26: (        MARK
   27: l            LIST       (MARK at 26)
   28: (        MARK
   29: l            LIST       (MARK at 28)
   30: (        MARK
   31: I            INT        1
   34: I            INT        2
   37: I            INT        3
   40: t            TUPLE      (MARK at 30)
   41: a        APPEND
   42: (        MARK
   43: d            DICT       (MARK at 42)
   44: S        STRING     'a'
   49: c        GLOBAL     '__builtin__ set'
   66: (        MARK
   67: (            MARK
   68: l                LIST       (MARK at 67)
   69: I            INT        1
   72: a            APPEND
   73: I            INT        2
   76: a            APPEND
   77: I            INT        3
   80: a            APPEND
   81: t            TUPLE      (MARK at 66)
   82: R        REDUCE
   83: s        SETITEM
   84: S        STRING     'c'
   89: (        MARK
   90: l            LIST       (MARK at 89)
   91: s        SETITEM
   92: S        STRING     'b'
   97: F        FLOAT      nan
  102: s        SETITEM
  103: a        APPEND
  104: a        APPEND
  105: t        TUPLE      (MARK at 25)
  106: R    REDUCE
  107: .    STOP
highest protocol among opcodes = 0
In [48]:
pickle_bomb = '''\
c__builtin__
eval
(c__builtin__
compile
(Vprint "BOOM!"
V-
Vexec
tRtR.'''
pickletools.dis(pickle_bomb)
    0: c    GLOBAL     '__builtin__ eval'
   18: (    MARK
   19: c        GLOBAL     '__builtin__ compile'
   40: (        MARK
   41: V            UNICODE    u'print "BOOM!"'
   56: V            UNICODE    u'-'
   59: V            UNICODE    u'exec'
   65: t            TUPLE      (MARK at 40)
   66: R        REDUCE
   67: t        TUPLE      (MARK at 18)
   68: R    REDUCE
   69: .    STOP
highest protocol among opcodes = 0
In [49]:
pickle.loads(pickle_bomb)
BOOM!

Несколько более читабельной альтернативой может послужить библиотека jsonpickle.

pip install jsonpickle
In [1]:
import jsonpickle
In [7]:
dumped = jsonpickle.dumps({1, 2.0, 2**100, None})
dumped
Out[7]:
'{"py/set": [1267650600228229401496703205376, 1, 2.0, null]}'
In [8]:
jsonpickle.loads(dumped)
Out[8]:
{None, 1, 2.0, 1267650600228229401496703205376L}

Bencode

Очень похож на JSON, но удобнее для хранения бинарных данных формат Bencode, используемый, например, в файлах *.torrent. Для его парсинга используется одноименная библиотека bencode.

pip install bencode
In [87]:
import bencode, requests, json

torrent = requests.get('http://d.rutor.info/download/511826').content
print torrent[:1250]
print
decoded = bencode.bdecode(torrent)
decoded['info']['pieces'] = '(less noise)'
decoded['announce-list'] = [['udp://shubt.net:2710'], '...']
print json.dumps(decoded, indent=4, sort_keys=True)
d8:announce20:udp://shubt.net:271013:announce-listll20:udp://shubt.net:2710el33:http://bt.dugtor.ru:2710/announceel70:http://bt.nnm-club.info:2710/00c1495fbcc09403e464f01d58faee25/announceel188:http://retracker.local/announce.php?size=3479044224&comment=http%3A%2F%2Fnnm-club.me%2Fforum%2Fviewtopic.php%3Fp%3D8331459&name=Linux+Mint+18+Sarah+%28Mate%2C+Cinnamon%29+%5B64bit%5D+2xDVDel31:http://retracker.local/announceel43:http://tracker.filetracker.pl:8089/announceel44:http://tracker2.wasabii.com.tw:6969/announceel40:http://tracker.grepler.com:6969/announceel35:http://125.227.35.196:6969/announceel41:http://tracker.tiny-vps.com:6969/announceel35:http://87.248.186.252:8080/announceel34:http://210.244.71.25:6969/announceel33:http://46.4.109.148:6969/announceel37:http://tracker.dler.org:6969/announceel37:udp://[2001:67c:28f8:92::1111:1]:2710el37:udp://ipv6.leechers-paradise.org:6969el24:udp://46.148.18.250:2710ee7:comment30:http://rutor.is/torrent/51182610:created by21:Friend721 (DugTor.ru)13:creation datei1467152079e4:infod5:filesld6:lengthi128e4:pathl12:checksum.md5eed6:lengthi1697906688e4:pathl31:linuxmint-18-cinnamon-64bit.isoeed6:lengthi1781137408e4:pathl27:linuxmint-18-mate-64bit.isoeee4:name18:LinuxMint-18-64bit12:piece lengthi52

{
    "announce": "udp://shubt.net:2710", 
    "announce-list": [
        [
            "udp://shubt.net:2710"
        ], 
        "..."
    ], 
    "comment": "http://rutor.is/torrent/511826", 
    "created by": "Friend721 (DugTor.ru)", 
    "creation date": 1467152079, 
    "info": {
        "files": [
            {
                "length": 128, 
                "path": [
                    "checksum.md5"
                ]
            }, 
            {
                "length": 1697906688, 
                "path": [
                    "linuxmint-18-cinnamon-64bit.iso"
                ]
            }, 
            {
                "length": 1781137408, 
                "path": [
                    "linuxmint-18-mate-64bit.iso"
                ]
            }
        ], 
        "name": "LinuxMint-18-64bit", 
        "piece length": 524288, 
        "pieces": "(less noise)"
    }, 
    "publisher": "rutor.is", 
    "publisher-url": "http://rutor.is/torrent/511826"
}

TOML

Если структурированные данные хочется задавать ручками в текстовом редакторе или диффать, ни JSON, ни XML не лучший выбор. Удобнее всего для этих целей TOML, язык разметки, похожий на формат *.ini файлов.

pip install toml

todo или лучше pytoml?

In [33]:
import toml
print toml.dumps({
    "abc": [1,2],
    "def": {
        u"Привет": {"o": 1, "o2": 2},
        "u": "i"
    },
    "y": "e"
})
y = "e"
abc = [ 1, 2,]

[def]
u = "i"

[def."Привет"]
o2 = 2
o = 1

In [35]:
toml.loads('''
[section]
[[section.value]]
a = "A"
b = "B"
[[section.value]]
a = "AA"
b = "BB"
''')
Out[35]:
{u'section': {u'value': [{u'a': u'A', u'b': u'B'},
   {u'a': u'AA', u'b': u'BB'}]}}

Табличные данные

Встроенная библиотека csv позволяет построчно читать в списки (и писать из) строки CSV-файла.

In [79]:
from io import BytesIO
import csv
In [96]:
csvfile = BytesIO('''\
headerA, headerB, headerC
1,2,3
4,5,6 пыщ
''')
for line in csv.reader(csvfile):
    print line
['headerA', ' headerB', ' headerC']
['1', '2', '3']
['4', '5', '6 \xd0\xbf\xd1\x8b\xd1\x89']
In [102]:
io = BytesIO()
writer = csv.writer(io, delimiter=';')
data = [
    ['a', 'b'],
    ['c', 'd"d'],
    ['e', 'f пыщ'],
]
writer.writerows(data)
writer.writerow(['g', 'h'])
print io.getvalue()
a;b
c;"d""d"
e;f пыщ
g;h

Для более высокоуровневой работы с табличными данными (обычно исходно в формате csv) в Python имеется библиотека pandas, предоставляющая доступ через не самый интуитивный API к различным выборкам и группировкам. http://pandas.pydata.org/pandas-docs/stable/index.html

Основные классы pandas:

  • Series, похожий на 1D numpy.array, в котором можно именовать индексы
  • DataFrame, 2D таблица, похожая на словарь из колонок-Series

todo

import pandas.tseries.offsets

df['column']
df.index, df.columns, df.values

df.set_index(["State", "City"]).sortlevel(0)
df.set_index("City").sort(["State", "NumericPopulation"], ascending=[False, True])

df.groupby(df.columns[0]).aggregate(average)
df[df.columns[0]].apply(log10)

df.name.str.split(" ", expand=True)
df.groupby('name')['activity'].value_counts()
df.groupby('name')['activity'].value_counts().unstack().fillna(0)
on which row this column is changing by doing this: df.name!=df.name.shift()
df.sort_values(by=['name','timestamp'])

pandas.qcut(data.weight, 10, labels=False) ввод новой фичи, дециля?

df.pivot(index='date', columns='variable', values='value') EAV->relation
df.melt(id_vars=['first', 'last'])

pandas.crosstab
pivot_table

labels, uniques = pd.factorize(x)
Out[111]: array([ 0,  0, -1,  1,  2,  3])
Out[112]: Index(['A', 'B', 3.14, inf], dtype='object')

scatter_matrix

df.corr()

data = data.fillna(data.median(axis=0), axis=0)
pandas.get_dummies

concat, join
In [2]:
import pandas
In [3]:
df = pandas.DataFrame([[1,2],[3,4],[2,5]], columns=['a','b'], index=['first', 'second', 'third'])
print df.shape
print df.columns
print df.index
df
(3, 2)
Index([u'a', u'b'], dtype='object')
Index([u'first', u'second', u'third'], dtype='object')
Out[3]:
a b
first 1 2
second 3 4
third 2 5
In [4]:
df.info()
<class 'pandas.core.frame.DataFrame'>
Index: 3 entries, first to third
Data columns (total 2 columns):
a    3 non-null int64
b    3 non-null int64
dtypes: int64(2)
memory usage: 72.0+ bytes
In [5]:
df.describe()
Out[5]:
a b
count 3.0 3.000000
mean 2.0 3.666667
std 1.0 1.527525
min 1.0 2.000000
25% 1.5 3.000000
50% 2.0 4.000000
75% 2.5 4.500000
max 3.0 5.000000
In [6]:
df.reset_index()
Out[6]:
index a b
0 first 1 2
1 second 3 4
2 third 2 5
In [7]:
df.rank()
Out[7]:
a b
first 1.0 1.0
second 3.0 2.0
third 2.0 3.0
In [8]:
print df.iloc[0,1]
print df.loc['first','b']
2
2

Объект pandas.DataFrame похож по API на словарь строка → numpy.array

In [71]:
import math
(df['PID'] * 2).apply(math.sqrt).astype(int)[:5].map({69: 'a'})
Out[71]:
0    a
1    a
2    a
3    a
4    a
Name: PID, dtype: object
In [72]:
df['New Column'] = df['Operation'].apply(lambda s:s[:-1])
In [73]:
df.head()
Out[73]:
Sequence Time of Day Process Name PID Operation Path Result Duration Detail New Column
0 NaN 20:35:12,0034072 Dwm.exe 2432 RegOpenKey HKLM\Hardware\DeviceMap\VIDEO SUCCESS 5.900000e-06 Desired Access: Read, Maximum Allowed RegOpenKe
1 NaN 20:35:12,0034247 Dwm.exe 2432 RegQueryValue HKLM\HARDWARE\DEVICEMAP\VIDEO\MaxObjectNumber SUCCESS 2.200000e-06 Type: REG_DWORD, Length: 4, Data: 10 RegQueryValu
2 NaN 20:35:12,0034379 Dwm.exe 2432 RegCloseKey HKLM\HARDWARE\DEVICEMAP\VIDEO SUCCESS 7.000000e-07 NaN RegCloseKe
3 NaN 20:35:12,0034510 Dwm.exe 2432 RegOpenKey HKLM\Hardware\DeviceMap\Video SUCCESS 1.800000e-06 Desired Access: Read RegOpenKe
4 NaN 20:35:12,0034597 Dwm.exe 2432 RegQueryValue HKLM\HARDWARE\DEVICEMAP\VIDEO\\Device\Video4 SUCCESS 1.900000e-06 Type: REG_SZ, Length: 202, Data: \Registry\Mac... RegQueryValu
5 NaN 20:35:12,0034721 Dwm.exe 2432 RegOpenKey HKLM\System\CurrentControlSet\CONTROL\VIDEO\{7... REPARSE 4.800000e-06 Desired Access: Read RegOpenKe
6 NaN 20:35:12,0034835 Dwm.exe 2432 RegOpenKey HKLM\System\CurrentControlSet\CONTROL\VIDEO\{7... SUCCESS 3.600000e-06 Desired Access: Read RegOpenKe
7 NaN 20:35:12,0034955 Dwm.exe 2432 RegCloseKey HKLM\HARDWARE\DEVICEMAP\VIDEO SUCCESS 7.000000e-07 NaN RegCloseKe
8 NaN 20:35:12,0035031 Dwm.exe 2432 RegQueryValue HKLM\System\CurrentControlSet\Control\CLASS\{4... NAME NOT FOUND 7.700000e-06 Length: 52 RegQueryValu
9 NaN 20:35:12,0035181 Dwm.exe 2432 RegCloseKey HKLM\System\CurrentControlSet\Control\CLASS\{4... SUCCESS 7.000000e-07 NaN RegCloseKe
10 NaN 20:35:12,0035287 Dwm.exe 2432 RegOpenKey HKLM\System\CurrentControlSet\Enum\PCI\VEN_808... SUCCESS 2.200000e-06 Desired Access: Read RegOpenKe
11 NaN 20:35:12,0035381 Dwm.exe 2432 RegQueryValue HKLM\System\CurrentControlSet\Enum\PCI\VEN_808... SUCCESS 1.500000e-06 Type: REG_MULTI_SZ, Length: 292, Data: PCI\VEN... RegQueryValu
12 NaN 20:35:12,0035476 Dwm.exe 2432 RegCloseKey HKLM\System\CurrentControlSet\Enum\PCI\VEN_808... SUCCESS 8.000000e-07 NaN RegCloseKe
13 NaN 20:35:12,0035560 Dwm.exe 2432 RegOpenKey HKLM\System\CurrentControlSet\Enum\PCI\VEN_808... SUCCESS 1.500000e-06 Desired Access: Read RegOpenKe
14 NaN 20:35:12,0035633 Dwm.exe 2432 RegQueryValue HKLM\System\CurrentControlSet\Enum\PCI\VEN_808... SUCCESS 1.100000e-06 Type: REG_MULTI_SZ, Length: 292, Data: PCI\VEN... RegQueryValu
15 NaN 20:35:12,0035721 Dwm.exe 2432 RegCloseKey HKLM\System\CurrentControlSet\Enum\PCI\VEN_808... SUCCESS 7.000000e-07 NaN RegCloseKe
16 NaN 20:35:12,0035801 Dwm.exe 2432 RegOpenKey HKLM\Hardware\DeviceMap\Video SUCCESS 1.800000e-06 Desired Access: Read RegOpenKe
17 NaN 20:35:12,0035877 Dwm.exe 2432 RegQueryValue HKLM\HARDWARE\DEVICEMAP\VIDEO\\Device\Video4 SUCCESS 1.100000e-06 Type: REG_SZ, Length: 202, Data: \Registry\Mac... RegQueryValu
18 NaN 20:35:12,0035961 Dwm.exe 2432 RegCloseKey HKLM\HARDWARE\DEVICEMAP\VIDEO SUCCESS 8.000000e-07 NaN RegCloseKe
19 NaN 20:35:12,0036917 Dwm.exe 2432 RegQueryKey HKLM SUCCESS 1.100000e-06 Query: HandleTags, HandleTags: 0x0 RegQueryKe
20 NaN 20:35:12,0037011 Dwm.exe 2432 RegOpenKey HKLM\System\CurrentControlSet\Control\Video\{7... REPARSE 3.700000e-06 Desired Access: Query Value RegOpenKe
21 NaN 20:35:12,0037106 Dwm.exe 2432 RegOpenKey HKLM\System\CurrentControlSet\Control\Video\{7... SUCCESS 3.300000e-06 Desired Access: Query Value RegOpenKe
22 NaN 20:35:12,0037216 Dwm.exe 2432 RegQueryValue HKLM\System\CurrentControlSet\Control\CLASS\{4... SUCCESS 6.200000e-06 Type: REG_BINARY, Length: 4, Data: 00 00 00 40 RegQueryValu
23 NaN 20:35:12,0037336 Dwm.exe 2432 RegQueryValue HKLM\System\CurrentControlSet\Control\CLASS\{4... BUFFER OVERFLOW 1.500000e-06 Length: 144 RegQueryValu
24 NaN 20:35:12,0037420 Dwm.exe 2432 RegQueryValue HKLM\System\CurrentControlSet\Control\CLASS\{4... SUCCESS 1.400000e-06 Type: REG_MULTI_SZ, Length: 142, Data: igdumdi... RegQueryValu
25 NaN 20:35:12,0037504 Dwm.exe 2432 RegCloseKey HKLM\System\CurrentControlSet\Control\CLASS\{4... SUCCESS 7.000000e-07 NaN RegCloseKe
26 NaN 20:35:12,0037606 Dwm.exe 2432 RegOpenKey HKLM\Hardware\DeviceMap\VIDEO SUCCESS 1.800000e-06 Desired Access: Read, Maximum Allowed RegOpenKe
27 NaN 20:35:12,0037686 Dwm.exe 2432 RegQueryValue HKLM\HARDWARE\DEVICEMAP\VIDEO\MaxObjectNumber SUCCESS 1.100000e-06 Type: REG_DWORD, Length: 4, Data: 10 RegQueryValu
28 NaN 20:35:12,0037770 Dwm.exe 2432 RegCloseKey HKLM\HARDWARE\DEVICEMAP\VIDEO SUCCESS 7.000000e-07 NaN RegCloseKe
29 NaN 20:35:12,0037861 Dwm.exe 2432 RegOpenKey HKLM\Hardware\DeviceMap\Video SUCCESS 1.500000e-06 Desired Access: Read RegOpenKe
... ... ... ... ... ... ... ... ... ... ...
75083 NaN 20:35:18,4282281 Dwm.exe 2432 RegCloseKey HKLM\System\CurrentControlSet\Enum\PCI\VEN_808... SUCCESS 1.100000e-06 NaN RegCloseKe
75084 NaN 20:35:18,4282412 Dwm.exe 2432 RegOpenKey HKLM\System\CurrentControlSet\Enum\PCI\VEN_808... SUCCESS 2.200000e-06 Desired Access: Read RegOpenKe
75085 NaN 20:35:18,4282536 Dwm.exe 2432 RegQueryValue HKLM\System\CurrentControlSet\Enum\PCI\VEN_808... SUCCESS 1.500000e-06 Type: REG_MULTI_SZ, Length: 292, Data: PCI\VEN... RegQueryValu
75086 NaN 20:35:18,4282675 Dwm.exe 2432 RegCloseKey HKLM\System\CurrentControlSet\Enum\PCI\VEN_808... SUCCESS 1.000000e-06 NaN RegCloseKe
75087 NaN 20:35:18,4282802 Dwm.exe 2432 RegOpenKey HKLM\Hardware\DeviceMap\Video SUCCESS 2.900000e-06 Desired Access: Read RegOpenKe
75088 NaN 20:35:18,4282926 Dwm.exe 2432 RegQueryValue HKLM\HARDWARE\DEVICEMAP\VIDEO\\Device\Video4 SUCCESS 1.800000e-06 Type: REG_SZ, Length: 202, Data: \Registry\Mac... RegQueryValu
75089 NaN 20:35:18,4283068 Dwm.exe 2432 RegCloseKey HKLM\HARDWARE\DEVICEMAP\VIDEO SUCCESS 8.000000e-07 NaN RegCloseKe
75090 NaN 20:35:18,4283830 Dwm.exe 2432 RegQueryKey HKLM SUCCESS 1.500000e-06 Query: HandleTags, HandleTags: 0x0 RegQueryKe
75091 NaN 20:35:18,4283969 Dwm.exe 2432 RegOpenKey HKLM\System\CurrentControlSet\Control\Video\{7... REPARSE 5.500000e-06 Desired Access: Query Value RegOpenKe
75092 NaN 20:35:18,4284119 Dwm.exe 2432 RegOpenKey HKLM\System\CurrentControlSet\Control\Video\{7... SUCCESS 4.700000e-06 Desired Access: Query Value RegOpenKe
75093 NaN 20:35:18,4284283 Dwm.exe 2432 RegQueryValue HKLM\System\CurrentControlSet\Control\CLASS\{4... SUCCESS 9.400000e-06 Type: REG_BINARY, Length: 4, Data: 00 00 00 40 RegQueryValu
75094 NaN 20:35:18,4284472 Dwm.exe 2432 RegQueryValue HKLM\System\CurrentControlSet\Control\CLASS\{4... BUFFER OVERFLOW 2.200000e-06 Length: 144 RegQueryValu
75095 NaN 20:35:18,4284585 Dwm.exe 2432 RegQueryValue HKLM\System\CurrentControlSet\Control\CLASS\{4... SUCCESS 2.200000e-06 Type: REG_MULTI_SZ, Length: 142, Data: igdumdi... RegQueryValu
75096 NaN 20:35:18,4284713 Dwm.exe 2432 RegCloseKey HKLM\System\CurrentControlSet\Control\CLASS\{4... SUCCESS 1.400000e-06 NaN RegCloseKe
75097 NaN 20:35:18,4284884 Dwm.exe 2432 RegOpenKey HKLM\Hardware\DeviceMap\VIDEO SUCCESS 3.300000e-06 Desired Access: Read, Maximum Allowed RegOpenKe
75098 NaN 20:35:18,4285019 Dwm.exe 2432 RegQueryValue HKLM\HARDWARE\DEVICEMAP\VIDEO\MaxObjectNumber SUCCESS 1.500000e-06 Type: REG_DWORD, Length: 4, Data: 10 RegQueryValu
75099 NaN 20:35:18,4285161 Dwm.exe 2432 RegCloseKey HKLM\HARDWARE\DEVICEMAP\VIDEO SUCCESS 1.100000e-06 NaN RegCloseKe
75100 NaN 20:35:18,4285304 Dwm.exe 2432 RegOpenKey HKLM\Hardware\DeviceMap\Video SUCCESS 2.500000e-06 Desired Access: Read RegOpenKe
75101 NaN 20:35:18,4285428 Dwm.exe 2432 RegQueryValue HKLM\HARDWARE\DEVICEMAP\VIDEO\\Device\Video5 SUCCESS 1.800000e-06 Type: REG_SZ, Length: 202, Data: \Registry\Mac... RegQueryValu
75102 NaN 20:35:18,4285595 Dwm.exe 2432 RegOpenKey HKLM\System\CurrentControlSet\CONTROL\VIDEO\{7... REPARSE 4.000000e-06 Desired Access: Read RegOpenKe
75103 NaN 20:35:18,4285734 Dwm.exe 2432 RegOpenKey HKLM\System\CurrentControlSet\CONTROL\VIDEO\{7... SUCCESS 4.000000e-06 Desired Access: Read RegOpenKe
75104 NaN 20:35:18,4285902 Dwm.exe 2432 RegCloseKey HKLM\HARDWARE\DEVICEMAP\VIDEO SUCCESS 1.100000e-06 NaN RegCloseKe
75105 NaN 20:35:18,4286007 Dwm.exe 2432 RegQueryValue HKLM\System\CurrentControlSet\Control\CLASS\{4... NAME NOT FOUND 9.900000e-06 Length: 52 RegQueryValu
75106 NaN 20:35:18,4286223 Dwm.exe 2432 RegCloseKey HKLM\System\CurrentControlSet\Control\CLASS\{4... SUCCESS 1.000000e-06 NaN RegCloseKe
75107 NaN 20:35:18,4286354 Dwm.exe 2432 RegOpenKey HKLM\System\CurrentControlSet\Enum\PCI\VEN_808... SUCCESS 2.200000e-06 Desired Access: Read RegOpenKe
75108 NaN 20:35:18,4286481 Dwm.exe 2432 RegQueryValue HKLM\System\CurrentControlSet\Enum\PCI\VEN_808... SUCCESS 1.900000e-06 Type: REG_MULTI_SZ, Length: 292, Data: PCI\VEN... RegQueryValu
75109 NaN 20:35:18,4286624 Dwm.exe 2432 RegCloseKey HKLM\System\CurrentControlSet\Enum\PCI\VEN_808... SUCCESS 1.100000e-06 NaN RegCloseKe
75110 NaN 20:35:18,4286748 Dwm.exe 2432 RegOpenKey HKLM\System\CurrentControlSet\Enum\PCI\VEN_808... SUCCESS 2.200000e-06 Desired Access: Read RegOpenKe
75111 NaN 20:35:18,4286879 Dwm.exe 2432 RegQueryValue HKLM\System\CurrentControlSet\Enum\PCI\VEN_808... SUCCESS 1.400000e-06 Type: REG_MULTI_SZ, Length: 292, Data: PCI\VEN... RegQueryValu
75112 NaN 20:35:18,4287014 Dwm.exe 2432 RegCloseKey HKLM\System\CurrentControlSet\Enum\PCI\VEN_808... SUCCESS 1.100000e-06 NaN RegCloseKe

75113 rows × 10 columns

In [74]:
df.columns
Out[74]:
Index([u'Sequence', u'Time of Day', u'Process Name', u'PID', u'Operation',
       u'Path', u'Result', u'Duration', u'Detail', u'New Column'],
      dtype='object')
In [75]:
df.drop('New Column', 1).head()
Out[75]:
Sequence Time of Day Process Name PID Operation Path Result Duration Detail
0 NaN 20:35:12,0034072 Dwm.exe 2432 RegOpenKey HKLM\Hardware\DeviceMap\VIDEO SUCCESS 5.900000e-06 Desired Access: Read, Maximum Allowed
1 NaN 20:35:12,0034247 Dwm.exe 2432 RegQueryValue HKLM\HARDWARE\DEVICEMAP\VIDEO\MaxObjectNumber SUCCESS 2.200000e-06 Type: REG_DWORD, Length: 4, Data: 10
2 NaN 20:35:12,0034379 Dwm.exe 2432 RegCloseKey HKLM\HARDWARE\DEVICEMAP\VIDEO SUCCESS 7.000000e-07 NaN
3 NaN 20:35:12,0034510 Dwm.exe 2432 RegOpenKey HKLM\Hardware\DeviceMap\Video SUCCESS 1.800000e-06 Desired Access: Read
4 NaN 20:35:12,0034597 Dwm.exe 2432 RegQueryValue HKLM\HARDWARE\DEVICEMAP\VIDEO\\Device\Video4 SUCCESS 1.900000e-06 Type: REG_SZ, Length: 202, Data: \Registry\Mac...
5 NaN 20:35:12,0034721 Dwm.exe 2432 RegOpenKey HKLM\System\CurrentControlSet\CONTROL\VIDEO\{7... REPARSE 4.800000e-06 Desired Access: Read
6 NaN 20:35:12,0034835 Dwm.exe 2432 RegOpenKey HKLM\System\CurrentControlSet\CONTROL\VIDEO\{7... SUCCESS 3.600000e-06 Desired Access: Read
7 NaN 20:35:12,0034955 Dwm.exe 2432 RegCloseKey HKLM\HARDWARE\DEVICEMAP\VIDEO SUCCESS 7.000000e-07 NaN
8 NaN 20:35:12,0035031 Dwm.exe 2432 RegQueryValue HKLM\System\CurrentControlSet\Control\CLASS\{4... NAME NOT FOUND 7.700000e-06 Length: 52
9 NaN 20:35:12,0035181 Dwm.exe 2432 RegCloseKey HKLM\System\CurrentControlSet\Control\CLASS\{4... SUCCESS 7.000000e-07 NaN
10 NaN 20:35:12,0035287 Dwm.exe 2432 RegOpenKey HKLM\System\CurrentControlSet\Enum\PCI\VEN_808... SUCCESS 2.200000e-06 Desired Access: Read
11 NaN 20:35:12,0035381 Dwm.exe 2432 RegQueryValue HKLM\System\CurrentControlSet\Enum\PCI\VEN_808... SUCCESS 1.500000e-06 Type: REG_MULTI_SZ, Length: 292, Data: PCI\VEN...
12 NaN 20:35:12,0035476 Dwm.exe 2432 RegCloseKey HKLM\System\CurrentControlSet\Enum\PCI\VEN_808... SUCCESS 8.000000e-07 NaN
13 NaN 20:35:12,0035560 Dwm.exe 2432 RegOpenKey HKLM\System\CurrentControlSet\Enum\PCI\VEN_808... SUCCESS 1.500000e-06 Desired Access: Read
14 NaN 20:35:12,0035633 Dwm.exe 2432 RegQueryValue HKLM\System\CurrentControlSet\Enum\PCI\VEN_808... SUCCESS 1.100000e-06 Type: REG_MULTI_SZ, Length: 292, Data: PCI\VEN...
15 NaN 20:35:12,0035721 Dwm.exe 2432 RegCloseKey HKLM\System\CurrentControlSet\Enum\PCI\VEN_808... SUCCESS 7.000000e-07 NaN
16 NaN 20:35:12,0035801 Dwm.exe 2432 RegOpenKey HKLM\Hardware\DeviceMap\Video SUCCESS 1.800000e-06 Desired Access: Read
17 NaN 20:35:12,0035877 Dwm.exe 2432 RegQueryValue HKLM\HARDWARE\DEVICEMAP\VIDEO\\Device\Video4 SUCCESS 1.100000e-06 Type: REG_SZ, Length: 202, Data: \Registry\Mac...
18 NaN 20:35:12,0035961 Dwm.exe 2432 RegCloseKey HKLM\HARDWARE\DEVICEMAP\VIDEO SUCCESS 8.000000e-07 NaN
19 NaN 20:35:12,0036917 Dwm.exe 2432 RegQueryKey HKLM SUCCESS 1.100000e-06 Query: HandleTags, HandleTags: 0x0
20 NaN 20:35:12,0037011 Dwm.exe 2432 RegOpenKey HKLM\System\CurrentControlSet\Control\Video\{7... REPARSE 3.700000e-06 Desired Access: Query Value
21 NaN 20:35:12,0037106 Dwm.exe 2432 RegOpenKey HKLM\System\CurrentControlSet\Control\Video\{7... SUCCESS 3.300000e-06 Desired Access: Query Value
22 NaN 20:35:12,0037216 Dwm.exe 2432 RegQueryValue HKLM\System\CurrentControlSet\Control\CLASS\{4... SUCCESS 6.200000e-06 Type: REG_BINARY, Length: 4, Data: 00 00 00 40
23 NaN 20:35:12,0037336 Dwm.exe 2432 RegQueryValue HKLM\System\CurrentControlSet\Control\CLASS\{4... BUFFER OVERFLOW 1.500000e-06 Length: 144
24 NaN 20:35:12,0037420 Dwm.exe 2432 RegQueryValue HKLM\System\CurrentControlSet\Control\CLASS\{4... SUCCESS 1.400000e-06 Type: REG_MULTI_SZ, Length: 142, Data: igdumdi...
25 NaN 20:35:12,0037504 Dwm.exe 2432 RegCloseKey HKLM\System\CurrentControlSet\Control\CLASS\{4... SUCCESS 7.000000e-07 NaN
26 NaN 20:35:12,0037606 Dwm.exe 2432 RegOpenKey HKLM\Hardware\DeviceMap\VIDEO SUCCESS 1.800000e-06 Desired Access: Read, Maximum Allowed
27 NaN 20:35:12,0037686 Dwm.exe 2432 RegQueryValue HKLM\HARDWARE\DEVICEMAP\VIDEO\MaxObjectNumber SUCCESS 1.100000e-06 Type: REG_DWORD, Length: 4, Data: 10
28 NaN 20:35:12,0037770 Dwm.exe 2432 RegCloseKey HKLM\HARDWARE\DEVICEMAP\VIDEO SUCCESS 7.000000e-07 NaN
29 NaN 20:35:12,0037861 Dwm.exe 2432 RegOpenKey HKLM\Hardware\DeviceMap\Video SUCCESS 1.500000e-06 Desired Access: Read
... ... ... ... ... ... ... ... ... ...
75083 NaN 20:35:18,4282281 Dwm.exe 2432 RegCloseKey HKLM\System\CurrentControlSet\Enum\PCI\VEN_808... SUCCESS 1.100000e-06 NaN
75084 NaN 20:35:18,4282412 Dwm.exe 2432 RegOpenKey HKLM\System\CurrentControlSet\Enum\PCI\VEN_808... SUCCESS 2.200000e-06 Desired Access: Read
75085 NaN 20:35:18,4282536 Dwm.exe 2432 RegQueryValue HKLM\System\CurrentControlSet\Enum\PCI\VEN_808... SUCCESS 1.500000e-06 Type: REG_MULTI_SZ, Length: 292, Data: PCI\VEN...
75086 NaN 20:35:18,4282675 Dwm.exe 2432 RegCloseKey HKLM\System\CurrentControlSet\Enum\PCI\VEN_808... SUCCESS 1.000000e-06 NaN
75087 NaN 20:35:18,4282802 Dwm.exe 2432 RegOpenKey HKLM\Hardware\DeviceMap\Video SUCCESS 2.900000e-06 Desired Access: Read
75088 NaN 20:35:18,4282926 Dwm.exe 2432 RegQueryValue HKLM\HARDWARE\DEVICEMAP\VIDEO\\Device\Video4 SUCCESS 1.800000e-06 Type: REG_SZ, Length: 202, Data: \Registry\Mac...
75089 NaN 20:35:18,4283068 Dwm.exe 2432 RegCloseKey HKLM\HARDWARE\DEVICEMAP\VIDEO SUCCESS 8.000000e-07 NaN
75090 NaN 20:35:18,4283830 Dwm.exe 2432 RegQueryKey HKLM SUCCESS 1.500000e-06 Query: HandleTags, HandleTags: 0x0
75091 NaN 20:35:18,4283969 Dwm.exe 2432 RegOpenKey HKLM\System\CurrentControlSet\Control\Video\{7... REPARSE 5.500000e-06 Desired Access: Query Value
75092 NaN 20:35:18,4284119 Dwm.exe 2432 RegOpenKey HKLM\System\CurrentControlSet\Control\Video\{7... SUCCESS 4.700000e-06 Desired Access: Query Value
75093 NaN 20:35:18,4284283 Dwm.exe 2432 RegQueryValue HKLM\System\CurrentControlSet\Control\CLASS\{4... SUCCESS 9.400000e-06 Type: REG_BINARY, Length: 4, Data: 00 00 00 40
75094 NaN 20:35:18,4284472 Dwm.exe 2432 RegQueryValue HKLM\System\CurrentControlSet\Control\CLASS\{4... BUFFER OVERFLOW 2.200000e-06 Length: 144
75095 NaN 20:35:18,4284585 Dwm.exe 2432 RegQueryValue HKLM\System\CurrentControlSet\Control\CLASS\{4... SUCCESS 2.200000e-06 Type: REG_MULTI_SZ, Length: 142, Data: igdumdi...
75096 NaN 20:35:18,4284713 Dwm.exe 2432 RegCloseKey HKLM\System\CurrentControlSet\Control\CLASS\{4... SUCCESS 1.400000e-06 NaN
75097 NaN 20:35:18,4284884 Dwm.exe 2432 RegOpenKey HKLM\Hardware\DeviceMap\VIDEO SUCCESS 3.300000e-06 Desired Access: Read, Maximum Allowed
75098 NaN 20:35:18,4285019 Dwm.exe 2432 RegQueryValue HKLM\HARDWARE\DEVICEMAP\VIDEO\MaxObjectNumber SUCCESS 1.500000e-06 Type: REG_DWORD, Length: 4, Data: 10
75099 NaN 20:35:18,4285161 Dwm.exe 2432 RegCloseKey HKLM\HARDWARE\DEVICEMAP\VIDEO SUCCESS 1.100000e-06 NaN
75100 NaN 20:35:18,4285304 Dwm.exe 2432 RegOpenKey HKLM\Hardware\DeviceMap\Video SUCCESS 2.500000e-06 Desired Access: Read
75101 NaN 20:35:18,4285428 Dwm.exe 2432 RegQueryValue HKLM\HARDWARE\DEVICEMAP\VIDEO\\Device\Video5 SUCCESS 1.800000e-06 Type: REG_SZ, Length: 202, Data: \Registry\Mac...
75102 NaN 20:35:18,4285595 Dwm.exe 2432 RegOpenKey HKLM\System\CurrentControlSet\CONTROL\VIDEO\{7... REPARSE 4.000000e-06 Desired Access: Read
75103 NaN 20:35:18,4285734 Dwm.exe 2432 RegOpenKey HKLM\System\CurrentControlSet\CONTROL\VIDEO\{7... SUCCESS 4.000000e-06 Desired Access: Read
75104 NaN 20:35:18,4285902 Dwm.exe 2432 RegCloseKey HKLM\HARDWARE\DEVICEMAP\VIDEO SUCCESS 1.100000e-06 NaN
75105 NaN 20:35:18,4286007 Dwm.exe 2432 RegQueryValue HKLM\System\CurrentControlSet\Control\CLASS\{4... NAME NOT FOUND 9.900000e-06 Length: 52
75106 NaN 20:35:18,4286223 Dwm.exe 2432 RegCloseKey HKLM\System\CurrentControlSet\Control\CLASS\{4... SUCCESS 1.000000e-06 NaN
75107 NaN 20:35:18,4286354 Dwm.exe 2432 RegOpenKey HKLM\System\CurrentControlSet\Enum\PCI\VEN_808... SUCCESS 2.200000e-06 Desired Access: Read
75108 NaN 20:35:18,4286481 Dwm.exe 2432 RegQueryValue HKLM\System\CurrentControlSet\Enum\PCI\VEN_808... SUCCESS 1.900000e-06 Type: REG_MULTI_SZ, Length: 292, Data: PCI\VEN...
75109 NaN 20:35:18,4286624 Dwm.exe 2432 RegCloseKey HKLM\System\CurrentControlSet\Enum\PCI\VEN_808... SUCCESS 1.100000e-06 NaN
75110 NaN 20:35:18,4286748 Dwm.exe 2432 RegOpenKey HKLM\System\CurrentControlSet\Enum\PCI\VEN_808... SUCCESS 2.200000e-06 Desired Access: Read
75111 NaN 20:35:18,4286879 Dwm.exe 2432 RegQueryValue HKLM\System\CurrentControlSet\Enum\PCI\VEN_808... SUCCESS 1.400000e-06 Type: REG_MULTI_SZ, Length: 292, Data: PCI\VEN...
75112 NaN 20:35:18,4287014 Dwm.exe 2432 RegCloseKey HKLM\System\CurrentControlSet\Enum\PCI\VEN_808... SUCCESS 1.100000e-06 NaN

75113 rows × 9 columns

Продемонстрируем работу с pandas на примере файла лога Sysinternals Process Monitor, записанного при попытке исполнить import magic без правильных телодвижений.

Фильтр по колонке df.ColName или df['ColName'], df[['ColName1', 'ColName2']], если их несколько.

Фильтр по строкам df[mask], где mask какое-то условие над столбцами, например, df[~(df.ColName1 == 5) & (df.ColName2 < 5)].

Уникальная выборка df[condition][columns].unique() — возвращает array.

Сортировка по столбцу df.sort_values('ColName', ascending=False) (по умолчанию ascending=False); имена колонок и параметр ascending могут быть списками.

Проверка на вхождение значения столбца в список df.ColName.isin([values, ...]).

Группировка df.groupby(column_or_columns) возвращает pandas.core.groupby.DataFrameGroupBy object, для получения из него DataFrame надо использовать какую-нибудь агрегирующую функцию (по оставшимся несгруппированными столбцам), например

  • .sum(), min(), max(), idxmin(), idxmax(), mean(), median()
  • .size() (возвращает pandas.core.series.Series, преобразовать в DataFrame вызовом to_frame('SizeColumnName'))
  • .count() (число не NULL/nan записей)
  • .agg({'ColumnName': ['min', 'max', 'mean', 'median', ...]})

Вызов groupby делает значения колонок группировки индексами строк. Их можно вернуть обратно в значения строк вызовом .reset_index().

Группы можно отфильтровать вызовом df.groupby(columns).filter(callback), где callback принимает DataFrame для каждой группы и возвращает, включать ли ее в состав результирующего (несгруппированного!) DataFrame.

Топы можно получать df.nlargest(count, column) или .nsmallest.

Поменять местами строки и столбцы можно .T.

Удалить строку df.drop([index, ...])

Удалить столбец df.drop([column, ...], axis=1)

In [44]:
df.sort_index(ascending=True).cumsum()
Out[44]:
a b
first 1 2
second 4 6
third 6 11
In [39]:
df.sort_index(ascending=False)
Out[39]:
a b
third 2 5
second 3 4
first 1 2
In [40]:
df.sort_values('a', ascending=True)
Out[40]:
a b
first 1 2
third 2 5
second 3 4
In [57]:
import pandas

Объект pandas.DataFrame можно создать из массива словарей, из 2D массива, из словаря массивов,

In [177]:
pandas.DataFrame([{'a': 1, 'b': 2}, {'a': 3, 'b': 4}])
Out[177]:
a b
0 1 2
1 3 4
In [179]:
pandas.DataFrame([[1, 2], [3, 4]], columns=['a', 'b'])
Out[179]:
a b
0 1 2
1 3 4
In [180]:
pandas.DataFrame({'a': [1, 3], 'b': [2, 4]})
Out[180]:
a b
0 1 2
1 3 4

из базы данных SQL, из файла CSV.

In [157]:
import pymysql
conn = pymysql.connect(
    host='localhost', user='root', password='toor', db='bookwarrior',
    charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)
df = pandas.read_sql('SELECT * FROM updated WHERE Filesize > 1000000000', conn)
df.head()
Out[157]:
ID Title VolumeInfo Series Periodical Author Year Edition Publisher City ... MD5 Generic Visible Locator Local TimeAdded TimeLastModified Coverurl Tags IdentifierWODash
0 106315 Seismic Amplitude Interpretation DVD Hilterman Fred J. ... 4ECC43085AD2470DDE139CDA19515576 ban 0 2009-07-21 03:29:14 2013-12-30 19:27:10
1 106316 IOn SystemFour Reference Data ... 6D09557157049A450249789B67A21813 ban 0 2009-07-21 03:29:14 2013-12-30 19:27:10
2 283888 Библия Скорина ... 9E5D962AA7AAD600677843992580D4BE G:\!upload\!ADD\Лингвистика\Компаративистика\И... 0 2010-07-14 14:48:42 2014-09-04 03:01:57 283000/9E5D962AA7AAD600677843992580D4BE-g.jpg
3 198220 Путь к реальности, или законы, управляющие Все... Роджер Пенроуз 2007 Институт компьютерных исследований, Регулярная... ... 6D2A90A441094163C2F2DC00F287EE32 3B69975814637A6DF44EC9626B369589 no 1456630-Путь к реальности, или законы, управля... 0 2010-02-18 15:16:04 2016-03-20 09:50:50 198000/6d2a90a441094163c2f2dc00f287ee32.jpg 9785939726184
4 232910 Новый Завет Удовский 1892 Университетская типогр. ... 487313B08708B466D62A7AD2F4A15AF3 1534612-Чудовский Новый Завет=+chudovskij-NZ.pdf 0 2010-02-18 15:16:04 2016-03-14 16:48:04 232000/487313b08708b466d62a7ad2f4a15af3.jpg

5 rows × 47 columns

In [46]:
df = pandas.read_csv('C:\\Users\\User\\Desktop\\Logfile.CSV')
df.head()
Out[46]:
Sequence Time of Day Process Name PID Operation Path Result Duration Detail
0 NaN 20:35:12,0034072 Dwm.exe 2432 RegOpenKey HKLM\Hardware\DeviceMap\VIDEO SUCCESS 5.900000e-06 Desired Access: Read, Maximum Allowed
1 NaN 20:35:12,0034247 Dwm.exe 2432 RegQueryValue HKLM\HARDWARE\DEVICEMAP\VIDEO\MaxObjectNumber SUCCESS 2.200000e-06 Type: REG_DWORD, Length: 4, Data: 10
2 NaN 20:35:12,0034379 Dwm.exe 2432 RegCloseKey HKLM\HARDWARE\DEVICEMAP\VIDEO SUCCESS 7.000000e-07 NaN
3 NaN 20:35:12,0034510 Dwm.exe 2432 RegOpenKey HKLM\Hardware\DeviceMap\Video SUCCESS 1.800000e-06 Desired Access: Read
4 NaN 20:35:12,0034597 Dwm.exe 2432 RegQueryValue HKLM\HARDWARE\DEVICEMAP\VIDEO\\Device\Video4 SUCCESS 1.900000e-06 Type: REG_SZ, Length: 202, Data: \Registry\Mac...
In [115]:
df['Process Name'].unique()
Out[115]:
array(['Dwm.exe', 'svchost.exe', 'System', 'AIMP3.exe', 'Explorer.EXE',
       'csrss.exe', 'DllHost.exe', 'taskhost.exe', 'services.exe',
       'Miranda64.exe', 'VeraCrypt.exe', 'chrome.exe', 'python.exe',
       'lsass.exe', 'wmiprvse.exe', 'taskmgr.exe'], dtype=object)
In [113]:
df['Process Name'].value_counts()
Out[113]:
Dwm.exe          62750
svchost.exe       5028
chrome.exe        2357
wmiprvse.exe      1961
python.exe        1336
csrss.exe          742
VeraCrypt.exe      415
Explorer.EXE       144
System             103
AIMP3.exe           86
DllHost.exe         85
taskmgr.exe         49
taskhost.exe        19
lsass.exe           16
services.exe        16
Miranda64.exe        6
Name: Process Name, dtype: int64
In [47]:
system = [
    'Dwm.exe', 'svchost.exe', 'System', 'csrss.exe', 'DllHost.exe',
    'taskhost.exe', 'services.exe', 'VeraCrypt.exe', 'lsass.exe', 'wmiprvse.exe',
    'taskmgr.exe'
]
mask = ~df['Process Name'].isin(system)
In [48]:
group = df[mask][['PID', 'Process Name', 'Operation', 'Duration']].groupby(['Process Name', 'PID'])
group
Out[48]:
<pandas.core.groupby.DataFrameGroupBy object at 0x0000000019122550>
In [57]:
group.count().index
Out[57]:
MultiIndex(levels=[[u'AIMP3.exe', u'Explorer.EXE', u'Miranda64.exe', u'chrome.exe', u'python.exe'], [2012, 2508, 3912, 4184, 4988, 7120]],
           labels=[[0, 1, 2, 3, 4, 4], [0, 1, 2, 3, 4, 5]],
           names=[u'Process Name', u'PID'])
In [54]:
group.size().tolist()
Out[54]:
[86L, 144L, 6L, 2357L, 66L, 1270L]
In [140]:
group.size().to_frame('Size').reset_index()
Out[140]:
Process Name PID Size
0 AIMP3.exe 2012 86
1 Explorer.EXE 2508 144
2 Miranda64.exe 3912 6
3 chrome.exe 4184 2357
4 python.exe 4988 66
5 python.exe 7120 1270
In [141]:
group.size().to_frame('Size').reset_index().nlargest(3, 'Size')
Out[141]:
Process Name PID Size
3 chrome.exe 4184 2357
5 python.exe 7120 1270
1 Explorer.EXE 2508 144

Аналогично .nsmallest

In [142]:
def fi(g):
    return len(g) < 100
In [145]:
group.agg({'Duration': ['min', 'mean', 'max']}).T
Out[145]:
Process Name AIMP3.exe Explorer.EXE Miranda64.exe chrome.exe python.exe
PID 2012 2508 3912 4184 4988 7120
Duration min 4.000000e-07 0.000000 0.0 0.000000 0.000000 0.000000
mean 2.125919e-04 0.000020 0.0 0.000002 0.000190 0.000022
max 1.662280e-02 0.001062 0.0 0.000035 0.001988 0.003486
In [150]:
group.count().sort_values('Operation', ascending=False)
Out[150]:
Operation Duration
Process Name PID
chrome.exe 4184 2357 2357
python.exe 7120 1270 1270
Explorer.EXE 2508 144 144
AIMP3.exe 2012 86 86
python.exe 4988 66 66
Miranda64.exe 3912 6 6
In [151]:
group.sum()
Out[151]:
Duration
Process Name PID
AIMP3.exe 2012 0.018283
Explorer.EXE 2508 0.002945
Miranda64.exe 3912 0.000000
chrome.exe 4184 0.004051
python.exe 4988 0.012529
7120 0.028555

todo Уникальные строки сразу с несколькими колонками?

In [11]:
def extract_filename(rec):
    path = df.iloc[rec].Path
    return os.path.split(path)[1].lower()

filtr = (df['Process Name'] == 'python.exe') & (df.Operation == 'IRP_MJ_CREATE') #& (df.Result == 'NAME NOT FOUND')
gr = df[filtr].groupby(extract_filename)
gr['Result'].agg(len).sort_values(ascending=False)
Out[11]:
magic1.dll                        105
cygmagic-1.dll                    105
magic                              60
magic1                             50
magic.dll                          50
cygmagic-1                         50
magic.py                           13
magic.pyd                          10
magic.pyc                          10
magic.pyw                           9
history.sqlite-journal              5
interactiveshell.py                 3
<ipython-input-2-27b85091660b>      3
site-packages                       1
history.sqlite-wal                  1
                                    1
Name: Result, dtype: int64
In [16]:
report = df[filtr].groupby([extract_filename, 'Result']).size().unstack(fill_value=0)
report[report['SUCCESS'] == 0].sort_values('NAME NOT FOUND', ascending=False)
Out[16]:
Result NAME INVALID NAME NOT FOUND PATH NOT FOUND REPARSE SUCCESS
cygmagic-1.dll 0 79 24 2 0
magic1.dll 0 79 24 2 0
magic 0 47 12 1 0
cygmagic-1 0 37 12 1 0
magic.dll 0 37 12 1 0
magic1 0 37 12 1 0
magic.pyd 0 10 0 0 0
magic.pyw 0 9 0 0 0
history.sqlite-wal 0 1 0 0 0
0 0 1 0 0
<ipython-input-2-27b85091660b> 3 0 0 0 0

Из этого отчета видно, что отчаяннее всего Python пытался найти файлы magic.dll, magic1.dll или cymagic-1.dll.

todo

JOIN Use .merge() to join Pandas dataframes. You need to provide which columns to join on (left_on and right_on), and join type: inner (default), left (corresponds to LEFT OUTER in SQL), right (RIGHT OUTER), or outer (FULL OUTER).

UNION ALL and UNION Use pd.concat() to UNION ALL two dataframes:

To deduplicate things (equivalent of UNION), you’d also have to add .drop_duplicates().

df[mask].Column = new_value
df.drop(df[mask].index)
df.NewColumn = fn(df.OldColumn)
In [192]:
import sqlite3

con = sqlite3.connect(':memory:')
con.text_factory = str
df.to_sql('df', con)

cur = con.cursor()
print cur.execute('select count(*) from df').fetchall()
con.close()
[(75113,)]

todo

In [1]:
df.to_csv() # (filename)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-1-3bb28b1f4b24> in <module>()
----> 1 df.to_csv()

NameError: name 'df' is not defined
In [ ]:
pandas.read_excel('file.xlsx')
pandas.read_excel(pandas.ExcelFile('file.xlsx'), 'Sheet1')
df.to_excel('file.xlsx', sheet_name='Sheet 1')

One-hot кодирование данных

In [22]:
import numpy
Populating the interactive namespace from numpy and matplotlib
WARNING: pylab import has clobbered these variables: ['isnan', 'random', 'datetime', 'save']
`%matplotlib` prevents importing * from pylab and numpy
In [27]:
numpy.random.seed(0)
df = pandas.DataFrame(numpy.random.randint(0, 7, size=(8,)), columns=['cls'])
df
Out[27]:
cls
0 4
1 5
2 0
3 3
4 3
5 3
6 1
7 3
In [28]:
pandas.get_dummies(df['cls'], prefix='cls')
Out[28]:
cls_0 cls_1 cls_3 cls_4 cls_5
0 0 0 0 1 0
1 0 0 0 0 1
2 1 0 0 0 0
3 0 0 1 0 0
4 0 0 1 0 0
5 0 0 1 0 0
6 0 1 0 0 0
7 0 0 1 0 0

При выводе pandas может обрезать слишком длинные строки в ячейке таблицы. Изменить это поведение:

In [ ]:
pandas.set_option('display.max_colwidth', -1)

todo Пример

Иногда выборку данных над таблицей pandas быстрее записать в SQL, чем в вызовах методов pandas. На этот случай есть библиотека pandasql (входит в Anaconda).

In [36]:
from pandasql import sqldf

df = pandas.read_csv("files/heroes++.csv")
df.head()
Out[36]:
id localized_name name roles attack type
0 1 Anti-Mage antimage Carry Escape Nuker melee agility
1 2 Axe axe Initiator Durable Disabler Jungler melee strength
2 3 Bane bane Support Disabler Nuker Durable range intelligence
3 4 Bloodseeker bloodseeker Carry Disabler Jungler Nuker Initiator melee agility
4 5 Crystal Maiden crystal_maiden Support Disabler Nuker Jungler range intelligence
In [37]:
df[df.roles.map(lambda x: 'Disabler' in x) & (df.attack == 'melee') & (df.type == 'intelligence')][['localized_name', 'type']]
Out[37]:
localized_name type
53 Dark Seer intelligence
82 Ogre Magi intelligence
In [38]:
sqldf("SELECT localized_name, type FROM df WHERE attack='melee' AND roles LIKE '%Disabler%' AND type='intelligence'", globals())
Out[38]:
localized_name type
0 Dark Seer intelligence
1 Ogre Magi intelligence

Базы данных

Простейшей базой данных, поддерживающей SQL, является встраиваемая БД SQLite, использующая один файл для хранения реляционных таблиц. Ее можно использовать посредством встроенной библиотеки sqlite3. При этом никакого дополнительного ПО ставить не надо.

In [24]:
import sqlite3, os, IPython

db_filename = os.path.join(os.getenv('LOCALAPPDATA'), 'Google\\Chrome\\User Data\\Default\\Favicons - Copy')
conn = sqlite3.connect(db_filename)
cur = conn.cursor()
for item in cur.execute('SELECT name, type, sql FROM sqlite_master').fetchall():
    print item[0], item[1]
    print item[2]
    print
    
sql = 'SELECT image_data FROM favicon_bitmaps WHERE icon_id IN (SELECT id FROM favicons WHERE url LIKE ?)'
png = str(cur.execute(sql, ['%google%']).fetchone()[0])
print cur.description
conn.close()
IPython.display.display(IPython.display.Image(png))
meta table
CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY,value LONGVARCHAR)

sqlite_autoindex_meta_1 index
None

icon_mapping table
CREATE TABLE icon_mapping(id INTEGER PRIMARY KEY,page_url LONGVARCHAR NOT NULL,icon_id INTEGER)

icon_mapping_page_url_idx index
CREATE INDEX icon_mapping_page_url_idx ON icon_mapping(page_url)

icon_mapping_icon_id_idx index
CREATE INDEX icon_mapping_icon_id_idx ON icon_mapping(icon_id)

favicon_bitmaps table
CREATE TABLE favicon_bitmaps(id INTEGER PRIMARY KEY,icon_id INTEGER NOT NULL,last_updated INTEGER DEFAULT 0,image_data BLOB,width INTEGER DEFAULT 0,height INTEGER DEFAULT 0, last_requested INTEGER DEFAULT 0)

favicon_bitmaps_icon_id index
CREATE INDEX favicon_bitmaps_icon_id ON favicon_bitmaps(icon_id)

favicons table
CREATE TABLE "favicons" (id INTEGER PRIMARY KEY,url LONGVARCHAR NOT NULL,icon_type INTEGER DEFAULT 1)

favicons_url index
CREATE INDEX favicons_url ON favicons(url)

(('image_data', None, None, None, None, None, None),)

Обратите внимание на то, как следует осуществлять подстановку аргументов в SQL-запрос во избежание SQL injection.

In [35]:
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('''
CREATE TABLE IF NOT EXISTS sample(
    id INTEGER PRIMARY KEY,
    s TEXT,
    z REAL
)''')
cur.executemany('INSERT INTO sample VALUES(?, ?, ?)', [(1, 'abc', 3.14), (2, 'def', 2.72), (3, 'ghi', 1.62)])
conn.commit()

for record in cur.execute('SELECT * FROM sample'):
    print record

conn.close()
(1, u'abc', 3.14)
(2, u'def', 2.72)
(3, u'ghi', 1.62)

Запись в БД производится только при вызове conn.commit()

todo

sqlite3.register_adapter(np.ndarray, adapt_array) # return return sqlite3.Binary(...)
sqlite3.register_converter("array", convert_array)
create table test (idx integer primary key, X array, y integer );

Для более серьезных нагрузок лучше подходит промышленная СУБД MySQL (https://dev.mysql.com/downloads/mysql/), клиент к которой на чистом Python реализован в библиотеке pymysql. Работа с ней, за исключением коннекта, идет аналогично SQLite. Отладку запросов и просмотр данных удобно вести в GUI-клиенте HeidiSQL (https://www.heidisql.com/download.php). Для запуска службы установленного MySQL под Windows можно использовать командную строку (администратор) net start mysql.

pip install pymysql

todo По слухам mysqlclient быстрее в 10 раз

In [40]:
import pymysql

conn = pymysql.connect(
    host='localhost', user='root', password='toor', db='bookwarrior',
    charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)

try:
    with conn.cursor() as cur:
        sql = 'select * from updated where title like %s'
        cur.execute(sql, ['%quantum foam%'])
        print cur.fetchall()
finally:
    conn.close()
[{u'Bookmarked': u'', u'City': u'', u'Paginated': u'', u'Author': u'Kenneth W. Ford, John Archibald Wheeler', u'Generic': u'', u'Filesize': 3075899, u'Title': u'Geons, Black Holes, and Quantum Foam: A Life in Physics', u'Commentary': u'', u'Issue': u'0', u'DPI': 0, u'ASIN': u'', u'Extension': u'epub', u'UDC': u'', u'Visible': u'', u'Local': 0, u'ISSN': u'', u'LBC': u'', u'IdentifierWODash': u'0393319911,9780393319910', u'Pages': u'416', u'TimeLastModified': datetime.datetime(2016, 3, 20, 9, 50, 50), u'Cleaned': u'', u'Publisher': u'W. W. Norton & Company', u'TimeAdded': datetime.datetime(2015, 12, 10, 2, 44, 42), u'Doi': u'', u'Language': u'English', u'Googlebookid': u'', u'OpenLibraryID': u'', u'Coverurl': u'1412000/67b0d2116b5926efc6ab990fa27f1ae7-d.jpg', u'Locator': u'0393319911GBHF.epub', u'DDC': u'', u'Identifier': u'0393319911,9780393319910', u'ID': 1412770, u'MD5': u'67b0d2116b5926efc6ab990fa27f1ae7', u'VolumeInfo': u'', u'Orientation': u'', u'Searchable': u'', u'Color': u'', u'Series': u'', u'Tags': u'Scientists Professionals Academics Biographies Memoirs History Philosophy Science Math Physics Acoustics Sound Applied Astrophysics Biophysics Chaos Theory Chemical Cosmology Dynamics Electromagnetism Electron Microscopy Energy Engineering Entropy Gas Mechanics Geophysics Gravity Light Mathematical Nanostructures Nuclear Optics Quantum Chemistry Relativity Solid State System Time Waves Wave', u'Library': u'', u'Topic': u'', u'Edition': u'1', u'Scanned': u'', u'LCC': u'', u'Periodical': u'', u'Year': u'2000', u'PagesInFile': 0}]

В целях консистентности cursor.execute возвращает число затронутых записей, а не cursor, а для подстановки параметров в SQL-запрос служит плейсхолдер %s вместо ?

Иногда SQL нужно парсить вне БД, тогда может пригодиться библиотека sqlparse

pip install sqlparse
In [41]:
import sqlparse
In [48]:
sql = 'SELECT image_data FROM favicon_bitmaps WHERE icon_id IN (SELECT id FROM favicons WHERE url LIKE "a%")'
for item in sqlparse.parse(sql):
    item._pprint_tree()
 0 DML 'SELECT'
 1 Whitespace ' '
 2 Identifier 'image_...'
 |  0 Name 'image_...'
 3 Whitespace ' '
 4 Keyword 'FROM'
 5 Whitespace ' '
 6 Identifier 'favico...'
 |  0 Name 'favico...'
 7 Whitespace ' '
 8 Where 'WHERE ...'
 |  0 Keyword 'WHERE'
 |  1 Whitespace ' '
 |  2 Identifier 'icon_id'
 |  |  0 Name 'icon_id'
 |  3 Whitespace ' '
 |  4 Keyword 'IN'
 |  5 Whitespace ' '
 |  6 Parenthesis '(SELEC...'
 |  |  0 Punctuation '('
 |  |  1 DML 'SELECT'
 |  |  2 Whitespace ' '
 |  |  3 Identifier 'id'
 |  |  |  0 Name 'id'
 |  |  4 Whitespace ' '
 |  |  5 Keyword 'FROM'
 |  |  6 Whitespace ' '
 |  |  7 Identifier 'favico...'
 |  |  |  0 Name 'favico...'
 |  |  8 Whitespace ' '
 |  |  9 Where 'WHERE ...'
 |  |  |  0 Keyword 'WHERE'
 |  |  |  1 Whitespace ' '
 |  |  |  2 Identifier 'url'
 |  |  |  |  0 Name 'url'
 |  |  |  3 Whitespace ' '
 |  |  |  4 Keyword 'LIKE'
 |  |  |  5 Whitespace ' '
 |  |  |  6 Identifier '"a%"'
 |  |  |  |  0 Symbol '"a%"'
 |  | 10 Punctuation ')'

Упростить отладку SQL-запросов (или написание нарратива) может IPython-расширение ipython-sql.

pip install ipython-sql
In [10]:
%load_ext sql
%sql mysql+pymysql://root:[email protected]/bookwarrior?charset=utf8
In [110]:
%sql select Author, Title, Filesize from updated where Filesize > 1500000000 order by Filesize desc
 * mysql+pymysql://root:***@localhost/bookwarrior?charset=utf8
11 rows affected.
Out[110]:
Author Title Filesize
Academic Press Inc Encyclopedia of Physical Science and Technology: v. 1-18 2301286288
George L Trigg; Wiley InterScience (Online service) Encyclopedia of applied physics 2113552329
Библия Скорина 1838268939
Birdsall, C.K; Langdon, A.B Plasma Physics via Computer Simulation 1835668880
Edward W Abel; F Gordon A Stone; Geoffrey Wilkinson Comprehensive organometallic chemistry II : a review of the literature 1982-1994 1831006210
Справочник корабельного состава военно-морских флотов мира 1787078464
Jeffrey C. Posnick (Auth.) Orthognathic Surgery. Principles and Practice 1748821843
Aversa, Stefano; Cascini, Leonardo; Picarelli, Luciano; Scavia, Claudio Landslides and engineered slopes : experience, theory and practice 1732284625
Essential Readings in Light Metals: Alumina and Bauxite, Volume 1 1731794911
Роджер Пенроуз Путь к реальности, или законы, управляющие Вселенной 1573490760
James W Patterson, Gregory A Hosler Weedon’s Skin Pathology 1522413388

Семантические БД

Реляционные таблицы плохо справляются с задачей хранения данных о реальном мире со сложной онтологией, неполнотой, указанием источников данных. Значительно удобнее для этих целей семантические базы данных, хранящие данные в виде троек-утверждений (субъект, предикат, объект), например, (Великобритания, имеет-столицей, Лондон). Субъект и предикат это некоторые URL (в том же синтаксисе, но не отвечают никаким реальным адресам в интернете), а объект может быть как URL, так и литералом (числом, строкой). URL кодифицируют и объекты, и их классы, и отношения, одна и та же сущность может иметь одинаковые URL в разных БД из разных источников, что позволяет их объединять в единый источник данных. Набор таких переиспользуемых URL с их семантикой и отношениями называется онтологией.

Для операций (выборка таблицы, конструирование графа, проверка существования подграфа, вставка/удаление данных) над семантическими БД используется язык SPARQL (https://www.w3.org/TR/rdf-sparql-query/), отдаленно похожий на SQL, но значительно более мощный. Ниже приведен фрагмент данных (12 стран Южной Америки, их столицы и население столиц) из семантической БД в синтаксисе Turtle (https://www.w3.org/TeamSubmission/turtle/). Он получен исполнением такого SPARQL-запроса из SPARQL endpoint одной из крупнейших открытых семантических БД DBpedia, которая хранит все размеченные данные из Wikipedia http://dbpedia.org/sparql/:

CONSTRUCT WHERE {
  ?country a yago:WikicatMemberStatesOfTheUnitedNations, yago:WikicatCountriesInSouthAmerica ;
    dbo:capital ?city .
  OPTIONAL { ?city dbo:populationTotal ?pop . }
}

Тройки задаются в виде S P O ., либо S P O ; P O ., либо S P O , O .. Префиксы URL можно объявлять и использовать, что улучшает читабельность. Список общепринятых префиксов широко распространенных онтологий можно найти здесь http://prefix.cc/popular/all .

@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix yago:  <http://dbpedia.org/class/yago/> .
@prefix dbr:   <http://dbpedia.org/resource/> .
@prefix dbo:   <http://dbpedia.org/ontology/> .

dbr:Argentina
    rdf:type yago:WikicatCountriesInSouthAmerica , yago:WikicatMemberStatesOfTheUnitedNations ;
    dbo:capital dbr:Buenos_Aires .
dbr:Buenos_Aires dbo:populationTotal "2890151"^^xsd:nonNegativeInteger .

dbr:Bolivia
    rdf:type yago:WikicatMemberStatesOfTheUnitedNations , yago:WikicatCountriesInSouthAmerica ;
    dbo:capital dbr:Sucre .
dbr:Sucre dbo:populationTotal "300000"^^xsd:nonNegativeInteger .

dbr:Brazil
    rdf:type yago:WikicatMemberStatesOfTheUnitedNations , yago:WikicatCountriesInSouthAmerica ;
    dbo:capital <http://dbpedia.org/resource/Bras\u00EDlia> .
<http://dbpedia.org/resource/Bras\u00EDlia> dbo:populationTotal "2556149"^^xsd:nonNegativeInteger .

dbr:Chile
    rdf:type yago:WikicatMemberStatesOfTheUnitedNations , yago:WikicatCountriesInSouthAmerica ;
    dbo:capital dbr:Santiago .
dbr:Santiago dbo:populationTotal "6158080"^^xsd:nonNegativeInteger .

dbr:Colombia
    rdf:type yago:WikicatCountriesInSouthAmerica , yago:WikicatMemberStatesOfTheUnitedNations ;
    dbo:capital <http://dbpedia.org/resource/Bogot\u00E1> .
<http://dbpedia.org/resource/Bogot\u00E1> dbo:populationTotal "7878783"^^xsd:nonNegativeInteger .

dbr:Ecuador
    rdf:type yago:WikicatMemberStatesOfTheUnitedNations , yago:WikicatCountriesInSouthAmerica ;
    dbo:capital dbr:Quito .
dbr:Quito dbo:populationTotal "2671191"^^xsd:nonNegativeInteger .

dbr:Guyana
    rdf:type yago:WikicatMemberStatesOfTheUnitedNations , yago:WikicatCountriesInSouthAmerica ;
    dbo:capital <http://dbpedia.org/resource/Georgetown,_Guyana> .
<http://dbpedia.org/resource/Georgetown,_Guyana> dbo:populationTotal "118363"^^xsd:nonNegativeInteger .

dbr:Paraguay
    rdf:type yago:WikicatMemberStatesOfTheUnitedNations , yago:WikicatCountriesInSouthAmerica ;
    dbo:capital <http://dbpedia.org/resource/Asunci\u00F3n> .
<http://dbpedia.org/resource/Asunci\u00F3n> dbo:populationTotal "525294"^^xsd:nonNegativeInteger .

dbr:Peru
    rdf:type yago:WikicatMemberStatesOfTheUnitedNations , yago:WikicatCountriesInSouthAmerica ;
    dbo:capital dbr:Lima .
dbr:Lima dbo:populationTotal "8852000"^^xsd:nonNegativeInteger .

dbr:Suriname
    rdf:type yago:WikicatMemberStatesOfTheUnitedNations , yago:WikicatCountriesInSouthAmerica ;
    dbo:capital dbr:Paramaribo .
dbr:Paramaribo dbo:populationTotal "240924"^^xsd:nonNegativeInteger .

dbr:Uruguay
    rdf:type yago:WikicatMemberStatesOfTheUnitedNations , yago:WikicatCountriesInSouthAmerica ;
    dbo:capital dbr:Montevideo .
dbr:Montevideo dbo:populationTotal "1305082"^^xsd:nonNegativeInteger .

dbr:Venezuela
    rdf:type yago:WikicatMemberStatesOfTheUnitedNations , yago:WikicatCountriesInSouthAmerica ;
    dbo:capital dbr:Caracas .
dbr:Caracas dbo:populationTotal "3273863"^^xsd:nonNegativeInteger .

В качестве клиентской библиотеки к семантическим БД в Python можно использовать SPARQLWrapper.

pip install SPARQLWrapper
In [1]:
import SPARQLWrapper
In [2]:
sparql = SPARQLWrapper.SPARQLWrapper('http://dbpedia.org/sparql')
sparql.setQuery('''
    PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
    PREFIX yago: <http://dbpedia.org/class/yago/>
    PREFIX dbr: <http://dbpedia.org/resource/>
    PREFIX dbo: <http://dbpedia.org/ontology/>
    
    SELECT * {
        ?country a yago:WikicatMemberStatesOfTheUnitedNations, yago:WikicatCountriesInSouthAmerica ;
            dbo:capital ?city ;
            rdfs:label ?clabel .
        ?city  rdfs:label ?label .
            
        OPTIONAL { ?country dbo:populationTotal ?cpop . }
        OPTIONAL { ?city dbo:populationTotal ?pop . }
            
        FILTER (lang(?clabel) = 'ru')
        FILTER (lang(?label) = 'ru')
    }
    ORDER BY ?clabel
''')
sparql.setReturnFormat(SPARQLWrapper.JSON)
results = sparql.query().convert()
In [3]:
print results
{u'head': {u'link': [], u'vars': [u'country', u'city', u'clabel', u'label', u'cpop', u'pop']}, u'results': {u'distinct': False, u'bindings': [{u'city': {u'type': u'uri', u'value': u'http://dbpedia.org/resource/Buenos_Aires'}, u'country': {u'type': u'uri', u'value': u'http://dbpedia.org/resource/Argentina'}, u'pop': {u'datatype': u'http://www.w3.org/2001/XMLSchema#nonNegativeInteger', u'type': u'typed-literal', u'value': u'2890151'}, u'label': {u'xml:lang': u'ru', u'type': u'literal', u'value': u'\u0411\u0443\u044d\u043d\u043e\u0441-\u0410\u0439\u0440\u0435\u0441'}, u'cpop': {u'datatype': u'http://www.w3.org/2001/XMLSchema#nonNegativeInteger', u'type': u'typed-literal', u'value': u'43417000'}, u'clabel': {u'xml:lang': u'ru', u'type': u'literal', u'value': u'\u0410\u0440\u0433\u0435\u043d\u0442\u0438\u043d\u0430'}}, {u'city': {u'type': u'uri', u'value': u'http://dbpedia.org/resource/Sucre'}, u'country': {u'type': u'uri', u'value': u'http://dbpedia.org/resource/Bolivia'}, u'pop': {u'datatype': u'http://www.w3.org/2001/XMLSchema#nonNegativeInteger', u'type': u'typed-literal', u'value': u'300000'}, u'label': {u'xml:lang': u'ru', u'type': u'literal', u'value': u'\u0421\u0443\u043a\u0440\u0435 (\u0433\u043e\u0440\u043e\u0434)'}, u'cpop': {u'datatype': u'http://www.w3.org/2001/XMLSchema#nonNegativeInteger', u'type': u'typed-literal', u'value': u'11410651'}, u'clabel': {u'xml:lang': u'ru', u'type': u'literal', u'value': u'\u0411\u043e\u043b\u0438\u0432\u0438\u044f'}}, {u'city': {u'type': u'uri', u'value': u'http://dbpedia.org/resource/Bras\xedlia'}, u'country': {u'type': u'uri', u'value': u'http://dbpedia.org/resource/Brazil'}, u'pop': {u'datatype': u'http://www.w3.org/2001/XMLSchema#nonNegativeInteger', u'type': u'typed-literal', u'value': u'2556149'}, u'label': {u'xml:lang': u'ru', u'type': u'literal', u'value': u'\u0411\u0440\u0430\u0437\u0438\u043b\u0438\u0430'}, u'cpop': {u'datatype': u'http://www.w3.org/2001/XMLSchema#nonNegativeInteger', u'type': u'typed-literal', u'value': u'206440850'}, u'clabel': {u'xml:lang': u'ru', u'type': u'literal', u'value': u'\u0411\u0440\u0430\u0437\u0438\u043b\u0438\u044f'}}, {u'country': {u'type': u'uri', u'value': u'http://dbpedia.org/resource/Venezuela'}, u'label': {u'xml:lang': u'ru', u'type': u'literal', u'value': u'\u041a\u0430\u0440\u0430\u043a\u0430\u0441'}, u'clabel': {u'xml:lang': u'ru', u'type': u'literal', u'value': u'\u0412\u0435\u043d\u0435\u0441\u0443\u044d\u043b\u0430'}, u'pop': {u'datatype': u'http://www.w3.org/2001/XMLSchema#nonNegativeInteger', u'type': u'typed-literal', u'value': u'3273863'}, u'city': {u'type': u'uri', u'value': u'http://dbpedia.org/resource/Caracas'}}, {u'city': {u'type': u'uri', u'value': u'http://dbpedia.org/resource/Georgetown,_Guyana'}, u'country': {u'type': u'uri', u'value': u'http://dbpedia.org/resource/Guyana'}, u'pop': {u'datatype': u'http://www.w3.org/2001/XMLSchema#nonNegativeInteger', u'type': u'typed-literal', u'value': u'118363'}, u'label': {u'xml:lang': u'ru', u'type': u'literal', u'value': u'\u0414\u0436\u043e\u0440\u0434\u0436\u0442\u0430\u0443\u043d'}, u'cpop': {u'datatype': u'http://www.w3.org/2001/XMLSchema#nonNegativeInteger', u'type': u'typed-literal', u'value': u'735554'}, u'clabel': {u'xml:lang': u'ru', u'type': u'literal', u'value': u'\u0413\u0430\u0439\u0430\u043d\u0430'}}, {u'city': {u'type': u'uri', u'value': u'http://dbpedia.org/resource/Bogot\xe1'}, u'country': {u'type': u'uri', u'value': u'http://dbpedia.org/resource/Colombia'}, u'pop': {u'datatype': u'http://www.w3.org/2001/XMLSchema#nonNegativeInteger', u'type': u'typed-literal', u'value': u'7878783'}, u'label': {u'xml:lang': u'ru', u'type': u'literal', u'value': u'\u0411\u043e\u0433\u043e\u0442\u0430'}, u'cpop': {u'datatype': u'http://www.w3.org/2001/XMLSchema#nonNegativeInteger', u'type': u'typed-literal', u'value': u'48786100'}, u'clabel': {u'xml:lang': u'ru', u'type': u'literal', u'value': u'\u041a\u043e\u043b\u0443\u043c\u0431\u0438\u044f'}}, {u'city': {u'type': u'uri', u'value': u'http://dbpedia.org/resource/Asunci\xf3n'}, u'country': {u'type': u'uri', u'value': u'http://dbpedia.org/resource/Paraguay'}, u'pop': {u'datatype': u'http://www.w3.org/2001/XMLSchema#nonNegativeInteger', u'type': u'typed-literal', u'value': u'525294'}, u'label': {u'xml:lang': u'ru', u'type': u'literal', u'value': u'\u0410\u0441\u0443\u043d\u0441\u044c\u043e\u043d'}, u'cpop': {u'datatype': u'http://www.w3.org/2001/XMLSchema#nonNegativeInteger', u'type': u'typed-literal', u'value': u'6783272'}, u'clabel': {u'xml:lang': u'ru', u'type': u'literal', u'value': u'\u041f\u0430\u0440\u0430\u0433\u0432\u0430\u0439'}}, {u'city': {u'type': u'uri', u'value': u'http://dbpedia.org/resource/Lima'}, u'country': {u'type': u'uri', u'value': u'http://dbpedia.org/resource/Peru'}, u'pop': {u'datatype': u'http://www.w3.org/2001/XMLSchema#nonNegativeInteger', u'type': u'typed-literal', u'value': u'8852000'}, u'label': {u'xml:lang': u'ru', u'type': u'literal', u'value': u'\u041b\u0438\u043c\u0430'}, u'cpop': {u'datatype': u'http://www.w3.org/2001/XMLSchema#nonNegativeInteger', u'type': u'typed-literal', u'value': u'31151643'}, u'clabel': {u'xml:lang': u'ru', u'type': u'literal', u'value': u'\u041f\u0435\u0440\u0443'}}, {u'city': {u'type': u'uri', u'value': u'http://dbpedia.org/resource/Paramaribo'}, u'country': {u'type': u'uri', u'value': u'http://dbpedia.org/resource/Suriname'}, u'pop': {u'datatype': u'http://www.w3.org/2001/XMLSchema#nonNegativeInteger', u'type': u'typed-literal', u'value': u'240924'}, u'label': {u'xml:lang': u'ru', u'type': u'literal', u'value': u'\u041f\u0430\u0440\u0430\u043c\u0430\u0440\u0438\u0431\u043e'}, u'cpop': {u'datatype': u'http://www.w3.org/2001/XMLSchema#nonNegativeInteger', u'type': u'typed-literal', u'value': u'573311'}, u'clabel': {u'xml:lang': u'ru', u'type': u'literal', u'value': u'\u0421\u0443\u0440\u0438\u043d\u0430\u043c'}}, {u'city': {u'type': u'uri', u'value': u'http://dbpedia.org/resource/Montevideo'}, u'country': {u'type': u'uri', u'value': u'http://dbpedia.org/resource/Uruguay'}, u'pop': {u'datatype': u'http://www.w3.org/2001/XMLSchema#nonNegativeInteger', u'type': u'typed-literal', u'value': u'1305082'}, u'label': {u'xml:lang': u'ru', u'type': u'literal', u'value': u'\u041c\u043e\u043d\u0442\u0435\u0432\u0438\u0434\u0435\u043e'}, u'cpop': {u'datatype': u'http://www.w3.org/2001/XMLSchema#nonNegativeInteger', u'type': u'typed-literal', u'value': u'3427000'}, u'clabel': {u'xml:lang': u'ru', u'type': u'literal', u'value': u'\u0423\u0440\u0443\u0433\u0432\u0430\u0439'}}, {u'city': {u'type': u'uri', u'value': u'http://dbpedia.org/resource/Santiago'}, u'country': {u'type': u'uri', u'value': u'http://dbpedia.org/resource/Chile'}, u'pop': {u'datatype': u'http://www.w3.org/2001/XMLSchema#nonNegativeInteger', u'type': u'typed-literal', u'value': u'6158080'}, u'label': {u'xml:lang': u'ru', u'type': u'literal', u'value': u'\u0421\u0430\u043d\u0442\u044c\u044f\u0433\u043e'}, u'cpop': {u'datatype': u'http://www.w3.org/2001/XMLSchema#nonNegativeInteger', u'type': u'typed-literal', u'value': u'18006407'}, u'clabel': {u'xml:lang': u'ru', u'type': u'literal', u'value': u'\u0427\u0438\u043b\u0438'}}, {u'city': {u'type': u'uri', u'value': u'http://dbpedia.org/resource/Quito'}, u'country': {u'type': u'uri', u'value': u'http://dbpedia.org/resource/Ecuador'}, u'pop': {u'datatype': u'http://www.w3.org/2001/XMLSchema#nonNegativeInteger', u'type': u'typed-literal', u'value': u'2671191'}, u'label': {u'xml:lang': u'ru', u'type': u'literal', u'value': u'\u041a\u0438\u0442\u043e'}, u'cpop': {u'datatype': u'http://www.w3.org/2001/XMLSchema#nonNegativeInteger', u'type': u'typed-literal', u'value': u'16144000'}, u'clabel': {u'xml:lang': u'ru', u'type': u'literal', u'value': u'\u042d\u043a\u0432\u0430\u0434\u043e\u0440'}}], u'ordered': True}}

На таблице хорошо видна и основная проблема семантических БД — злоупотребление возможностью указывать неполные данные. Для Венесуэлы в DBpedia нет данных о численности населения.

In [4]:
import tabulate, IPython, math

headers=[u'Страна', u'Население', u'Столица', u'Население столицы', u'Доля населения столицы в населении страны']
lines = []
for result in results['results']['bindings']:
    clabel = result['clabel']['value']
    cpop = result.get('cpop', {'value': ''})['value']
    label = result['label']['value']
    pop = result['pop']['value']
    lines.append([clabel, cpop, label, pop, '%.2f%%' % (float(pop) / (float(cpop) if cpop else float('nan')) * 100)])

IPython.display.display(IPython.display.HTML(tabulate.tabulate(lines, tablefmt='html', headers=headers)))
Страна Население Столица Население столицыДоля населения столицы в населении страны
Аргентина43417000 Буэнос-Айрес 28901516.66%
Боливия 11410651 Сукре (город) 3000002.63%
Бразилия 206440850 Бразилиа 25561491.24%
Венесуэла Каракас 3273863nan%
Гайана 735554 Джорджтаун 11836316.09%
Колумбия 48786100 Богота 787878316.15%
Парагвай 6783272 Асунсьон 5252947.74%
Перу 31151643 Лима 885200028.42%
Суринам 573311 Парамарибо 24092442.02%
Уругвай 3427000 Монтевидео 130508238.08%
Чили 18006407 Сантьяго 615808034.20%
Эквадор 16144000 Кито 267119116.55%

Семантическую СУБД можно установить и локально, предпочтительным вариантом является Blazegraph (https://www.blazegraph.com/download/). Скачайте файл blazegraph.jar, создайте рядом файл настроек RWStore.properties, в котором пропишите (для Windows)

com.bigdata.rwstore.RWStore.readBlobsAsync=false
com.bigdata.journal.AbstractJournal.file=blazegraph.jnl

com.bigdata.rdf.sail.truthMaintenance=false
com.bigdata.rdf.store.AbstractTripleStore.quads=false
com.bigdata.rdf.store.AbstractTripleStore.axiomsClass=com.bigdata.rdf.axioms.NoAxioms

Три последние строки отключают встроенный вывод новых триплов по правилам, сильно уменьшающий производительность и как правило не нужный. Без них пришлось бы перед каждым INSERT вставлять DISABLE ENTAILMENTS;.

запустите сервер командой

java -server -Xmx4g -Djetty.host=127.0.0.1 -Dbigdata.propertyFile=RWStore.properties -jar blazegraph.jar

Blazegraph создаст файл для данных blazegraph.jnl размером 210 МБ.

In [96]:
sparql = SPARQLWrapper.SPARQLWrapper('http://127.0.0.1:9999/blazegraph/sparql')
sparql.setQuery('SELECT (COUNT(*) as ?c) { ?s ?p ?o . }')
sparql.setReturnFormat(SPARQLWrapper.JSON)
print sparql.query().convert()
{u'head': {u'vars': [u'c']}, u'results': {u'bindings': [{u'c': {u'datatype': u'http://www.w3.org/2001/XMLSchema#integer', u'type': u'literal', u'value': u'28803'}}]}}

Последний дамп Wikidata можно скачать тут https://dumps.wikimedia.org/wikidatawiki/entities/latest-all.ttl.bz2 (28 ГБ)

Библиотека rdflib работает с графами, которые могут быть получены из SPARQL endpoint или из файлов.

In [2]:
import rdflib
In [170]:
g = rdflib.Graph()
g.load('http://dbpedia.org/resource/Semantic_Web') # g.loaf('file.ttl')

for s,p,o in g:
    if str(p) == 'http://www.w3.org/2000/01/rdf-schema#label':
        print s,p,o
http://dbpedia.org/resource/Semantic_Web http://www.w3.org/2000/01/rdf-schema#label Web semântica
http://dbpedia.org/resource/Semantic_Web http://www.w3.org/2000/01/rdf-schema#label ويب دلالي
http://dbpedia.org/resource/Semantic_Web http://www.w3.org/2000/01/rdf-schema#label Semantic Web
http://dbpedia.org/resource/Semantic_Web http://www.w3.org/2000/01/rdf-schema#label Web semántica
http://dbpedia.org/resource/Semantic_Web http://www.w3.org/2000/01/rdf-schema#label Semantic Web
http://dbpedia.org/resource/Semantic_Web http://www.w3.org/2000/01/rdf-schema#label 语义网
http://dbpedia.org/resource/Semantic_Web http://www.w3.org/2000/01/rdf-schema#label Семантическая паутина
http://dbpedia.org/resource/Semantic_Web http://www.w3.org/2000/01/rdf-schema#label Web semantico
http://dbpedia.org/resource/Semantic_Web http://www.w3.org/2000/01/rdf-schema#label Semantic Web
http://dbpedia.org/resource/Semantic_Web http://www.w3.org/2000/01/rdf-schema#label Web sémantique
http://dbpedia.org/resource/Semantic_Web http://www.w3.org/2000/01/rdf-schema#label セマンティック・ウェブ
http://dbpedia.org/resource/Semantic_Web http://www.w3.org/2000/01/rdf-schema#label Semantisch web
In [177]:
print g.serialize(format='turtle')
@prefix dbo: <http://dbpedia.org/ontology/> .
@prefix dbp: <http://dbpedia.org/property/> .
@prefix dct: <http://purl.org/dc/terms/> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix ns8: <http://purl.org/linguistics/gold/> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix prov: <http://www.w3.org/ns/prov#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

<http://dbpedia.org/resource/AdExtent> dbo:genre <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/Amit_Sheth> dbp:fields <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/Carole_Goble> dbo:field <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/Criticism_of_the_Semantic_Web> dbo:wikiPageRedirects <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/DBpedia> dbo:genre <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/David_Karger> dbo:field <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/Deborah_McGuinness> dbo:knownFor <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/Extended_Semantic_Web_Conference> dbo:academicDiscipline <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/Farshad_Fotouhi> dbo:field <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/Frank_van_Harmelen> dbo:field <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/Ian_Horrocks> dbo:field <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/International_Semantic_Web_Conference> dbo:academicDiscipline <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/James_Hendler> dbo:knownFor <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/Jena_(framework)> dbo:genre <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/Joseph_G._Davis> dbo:field <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/Marc_Twagirumukiza> dbo:field <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/Mulgara_(software)> dbo:genre <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/N-Triples> dbp:genre <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/Nigel_Shadbolt> dbo:field <http://dbpedia.org/resource/Semantic_Web> ;
    dbo:knownFor <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/Notation3> dbp:genre <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/Ontotext> dbo:industry <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/Open_Semantic_Framework> dbo:genre <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/RDF/XML> dbp:genre <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/RDF_Schema> dbp:domain <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/RDFa> dbp:domain <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/Resource_Description_Framework> dbp:domain <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/Rudi_Studer> dbo:field <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/RuleML> dbp:focus <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/Schema.org> dbp:domain <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/SemWeb> dbo:wikiPageRedirects <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/Semantic-web> dbo:wikiPageRedirects <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/Semantic_Internet> dbo:wikiPageRedirects <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/Semantic_integrity> dbo:wikiPageRedirects <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/Semantic_internet> dbo:wikiPageRedirects <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/Semantic_web> dbo:wikiPageRedirects <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/Semweb> dbo:wikiPageRedirects <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/Sesame_(framework)> dbo:genre <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/Stardog> dbo:genre <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/Syntactic_Web> dbo:wikiPageRedirects <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/The_semantic_web> dbo:wikiPageRedirects <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/TriG_(syntax)> dbp:genre <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/TriX_(syntax)> dbp:genre <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/Turtle_(syntax)> dbp:genre <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/UMBEL> dbo:genre <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/Web_3> dbo:wikiPageRedirects <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/Web_3.0> dbo:wikiPageRedirects <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/Wendy_Hall> dbo:field <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/YAGO_(database)> dbo:genre <http://dbpedia.org/resource/Semantic_Web> .

<http://en.wikipedia.org/wiki/Semantic_Web> foaf:primaryTopic <http://dbpedia.org/resource/Semantic_Web> .

<http://dbpedia.org/resource/Semantic_Web> a <http://dbpedia.org/class/yago/Abstraction100002137>,
        <http://dbpedia.org/class/yago/Act100030358>,
        <http://dbpedia.org/class/yago/Activity100407535>,
        <http://dbpedia.org/class/yago/Age104924103>,
        <http://dbpedia.org/class/yago/Attribute100024264>,
        <http://dbpedia.org/class/yago/Buzzword106608277>,
        <http://dbpedia.org/class/yago/Communication100033020>,
        <http://dbpedia.org/class/yago/Event100029378>,
        <http://dbpedia.org/class/yago/Message106598915>,
        <http://dbpedia.org/class/yago/Nonsense106607339>,
        <http://dbpedia.org/class/yago/Property104916342>,
        <http://dbpedia.org/class/yago/PsychologicalFeature100023100>,
        <http://dbpedia.org/class/yago/Service100577525>,
        <http://dbpedia.org/class/yago/WikicatBuzzwords>,
        <http://dbpedia.org/class/yago/WikicatInternetAges>,
        <http://dbpedia.org/class/yago/WikicatWebServices>,
        <http://dbpedia.org/class/yago/Work100575741>,
        <http://dbpedia.org/class/yago/YagoPermanentlyLocatedEntity>,
        dbo:Software,
        owl:Thing ;
    rdfs:label "ويب دلالي"@ar,
        "Semantic Web"@de,
        "Semantic Web"@en,
        "Web semántica"@es,
        "Web sémantique"@fr,
        "Web semantico"@it,
        "セマンティック・ウェブ"@ja,
        "Semantisch web"@nl,
        "Semantic Web"@pl,
        "Web semântica"@pt,
        "Семантическая паутина"@ru,
        "语义网"@zh ;
    dbo:abstract "إن ورود المعلومات على الإنترنت يزداد بشكل كبير، فقد أصبح الإنترنت مكانًا للتعبير عن الأفكار، سرد القصص، إنشاء المدونات ومشاركة الفيديوهات والصور والملفات الصوتية وما إلى ذلك. وهو ما جعل كمّ المعلومات المتوفرة للفرد الواحد أكبر بكثير ممايُمكن له أن يستفيد منه. تعريض العقل البشري لهذا الكم الهائل من المعلومات من شأنه أن يتسبب فيما يُمكن أن نصفه بوصف \"الضياع في فضاء المعلومات\"، وذلك راجع إلى بقاء المعلومات المفيدة بعيدة المنال بسبب تراكم الكثير من المعلومات غير المفيدة وغير المرتبطة بالموضوع المراد البحث عنه من قبل المستخدم.لحسن الحظ، مثلما يزداد ورود المعلومات، تزداد مقدرات معالجة المعلومات اوتوماتيكياً، لذا يوجد إمكانيات كبيرة للاستفادة من مقدرات الأتمتة هذه بهدف استخراج المعلومات والخدمات من فيضان الويب والمرتبطة بالمستخدم، وتوصيلها إليه عن طريق واجهة مستخدم معيارية (Standardized User Interface). إن أهمية الحصول على المعلومات بهذه الطريقة التكيفية يزداد بازدياد كتلة المعلومات المتوفرة على الإنترنت. تعتبر شبكة الوب أغنى المصادر المعلوماتية بما تحويه من مستندات ومعلومات ومصادر منوعة يمكن الوصول إليها عن طريق محركات البحث التقليدية. غير أن تنظيم هذه المعلومات والمستندات بصورة تسهل عملية البحث فيها والوصول إليها، يعتبر أمراً غاية في الصعوبة. يضاف إلى ذلك، أنه في ظل التزايد المستمر في حجم المعلومات المنشورة في شبكة الويب أصبح من الصعوبة بمكان قيام محركات البحث بإيجاد المعلومات المناسبة. ومن هذه المشكلة ظهرت فكرة \"الويب ذات الدلالات والمعاني اللفظية\"، أو ما يطلق عليه بالإنجليزية مصطلح (Semantic Web)، والتي هي امتداد للويب الحالية ولكن تختلف عنها بأنها تتفهم مدلولات الألفاظ والمعاني البشرية."@ar,
        "Das Semantic Web erweitert das Web, um Daten zwischen Rechnern einfacher austauschbar und für sie einfacher verwertbar zu machen; so kann beispielsweise der Begriff „Bremen“ in einem Webdokument um die Information ergänzt werden, ob hier ein Schiffs-, Familien- oder der Stadtname gemeint ist. Diese zusätzlichen Informationen explizieren die sonst nur unstrukturiert vorkommenden Daten. Zur Realisierung dienen Standards zur Veröffentlichung und Nutzung maschinenlesbarer Daten (insbesondere RDF). Während Menschen solche Informationen aus dem gegebenen Kontext schließen können (aus dem Gesamttext, über die Art der Publikation oder der Rubrik in selbiger, Bilder etc.) und derartige Verknüpfungen unbewusst aufbauen, muss Maschinen dieser Kontext erst beigebracht werden; hierzu werden die Inhalte mit weiterführenden Informationen verknüpft. Das Semantic Web beschreibt dazu konzeptionell einen „Giant Global Graph“ (engl. ‚gigantischer globaler Graph‘). Dabei werden sämtliche Sachen von Interesse identifiziert und mit einer eindeutigen Adresse versehen als Knoten angelegt, die wiederum durch Kanten (ebenfalls jeweils eindeutig benannt) miteinander verbunden sind. Einzelne Dokumente im Web beschreiben dann eine Reihe von Kanten, und die Gesamtheit all dieser Kanten entspricht dem globalen Graphen."@de,
        "The Semantic Web is an extension of the Web through standards by the World Wide Web Consortium (W3C). The standards promote common data formats and exchange protocols on the Web, most fundamentally the Resource Description Framework (RDF). According to the W3C, \"The Semantic Web provides a common framework that allows data to be shared and reused across application, enterprise, and community boundaries\". The term was coined by Tim Berners-Lee for a web of data that can be processed by machines.While its critics have questioned its feasibility, proponents argue that applications in industry, biology and human sciences research have already proven the validity of the original concept. The 2001 Scientific American article by Berners-Lee, Hendler, and Lassila described an expected evolution of the existing Web to a Semantic Web. In 2006, Berners-Lee and colleagues stated that: \"This simple idea…remains largely unrealized\".In 2013, more than four million Web domains contained Semantic Web markup."@en,
        "La web semántica (del inglés semantic web) es un conjunto de actividades desarrolladas en el seno de World Wide Web Consortium con tendencia a la creación de tecnologías para publicar datos legibles por aplicaciones informáticas (máquinas en la terminología de la Web semántica). Se basa en la idea de añadir metadatos semánticos y ontológicos a la World Wide Web. Esas informaciones adicionales —que describen el contenido, el significado y la relación de los datos— se deben proporcionar de manera formal, para que así sea posible evaluarlas automáticamente por máquinas de procesamiento. El objetivo es mejorar Internet ampliando la interoperabilidad entre los sistemas informáticos usando \"agentes inteligentes\". Agentes inteligentes son programas en las computadoras que buscan información sin operadores humanos. El precursor de la idea, Tim Berners-Lee, intentó desde el principio incluir información semántica en su creación, la World Wide Web, pero por diferentes causas no fue posible. Por ese motivo introdujo el concepto de semántica con la intención de recuperar dicha omisión."@es,
        "Le Web sémantique, ou toile sémantique, est une extension du Web standardisée par le World Wide Web Consortium (W3C). Ces standards encouragent l'utilisation de formats de données et de protocoles d'échange normés sur le Web, avec comme format de base le Resource Description Framework (RDF). Selon le W3C, « le Web sémantique fournit un modèle qui permet aux données d'être partagées et réutilisées entre plusieurs applications, entreprises et groupes d'utilisateurs ». L'expression a été inventée par Tim Berners-Lee (inventeur du Web et directeur du W3C), qui supervise le développement des technologies communes du Web sémantique. Il le définit comme « une toile de données qui peuvent être traitées directement et indirectement par des machines pour aider leurs utilisateurs à créer de nouvelles connaissances ». Pour y parvenir, le Web sémantique met en œuvre le Web des données qui consiste à lier et structurer l'information sur Internet pour accéder simplement à la connaissance qu'elle contient déjà. Alors que ses détracteurs ont mis en doute sa faisabilité, ses promoteurs font valoir que les applications réalisées par les chercheurs dans l'industrie, la biologie et les sciences humaines ont déjà prouvé la validité de ce nouveau concept. L'article original de Tim Berners-Lee en 2001 dans le Scientific American a décrit une évolution attendue du Web existant vers un Web sémantique, mais cela n'a pas encore eu lieu. En 2006, Tim Berners-Lee et ses collègues ont déclaré : « Cette idée simple… reste largement inexploitée. »"@fr,
        "Con il termine web semantico, termine coniato dal suo ideatore, Tim Berners-Lee, si intende la trasformazione del World Wide Web in un ambiente dove i documenti pubblicati (pagine HTML, file, immagini, e così via) sono associati ad informazioni e dati (metadati) che ne specificano il contesto semantico in un formato adatto all'interrogazione e l'interpretazione (es. tramite motori di ricerca) e, più in generale, all'elaborazione automatica. Con l'interpretazione del contenuto dei documenti che il Web semantico impone, saranno possibili ricerche molto più evolute delle attuali, basate sulla presenza nel documento di parole chiave, e altre operazioni specialistiche come la costruzione di reti di relazioni e connessioni tra documenti secondo logiche più elaborate del semplice collegamento ipertestuale."@it,
        "セマンティック・ウェブ(英: semantic web)は W3C のティム・バーナーズ=リーによって提唱された、ウェブページの意味を扱うことを可能とする標準やツール群の開発によってワールド・ワイド・ウェブの利便性を向上させるプロジェクト。セマンティック・ウェブの目的はウェブページの閲覧という行為に、データの交換の側面に加えて意味の疎通を付け加えることにある。 現在のワールド・ワイド・ウェブ上のコンテンツは主にHTMLで記述されている。HTMLでは文書構造を伝えることは可能だが、個々の単語の意味をはじめとする詳細な意味を伝えることはできない。これに対し、セマンティック・ウェブはXMLによって記述した文書にRDFやOWLを用いてタグを付け加える。この、データの意味を記述したタグが文書の含む意味を形式化し、コンピュータによる自動的な情報の収集や分析へのアプローチが可能となると期待されている。オントロジーを扱う階層まではW3Cにより標準化されているが、それ以上の階層の開発は難しいため、実現と標準化には長期間掛かると予想されている。また、既存のWebサイトに対するメタデータ付与の作業が必要であるため、Web全域への普及に関しても長期間掛かると予想されている。 セマンティックウェブはXML、XML Schema、RDF、RDF Schema、OWLなどの標準およびツール群から構成されている。「OWL ウェブ・オントロジー言語概要」はセマンティックウェブにおけるこれら標準およびツール群の機能・関連について述べている。"@ja,
        "Het semantisch web verschaft een standaardframework waarmee data gedeeld en hergebruikt kunnen worden. Het is een samenwerking onder leiding van het internationale orgaan voor internetstandaarden, het World Wide Web Consortium (W3C). Het semantisch web is geen synoniem voor Web 2.0, zoals soms wel wordt verondersteld. Tim Berners-Lee beschreef het semantische web als een component van 'Web 3.0'. Soms wordt het gebruikt als synoniem voor Web 3.0, hoewel de definities verschillen."@nl,
        """Semantic Web (sieci semantyczne) – projekt, który ma przyczynić się do utworzenia i rozpowszechnienia standardów opisywania treści w Internecie w sposób, który umożliwi maszynom i programom (np. tzw. agentom) przetwarzanie informacji w sposób odpowiedni do ich znaczenia. Wśród standardów sieci semantycznych znajdują się m.in. OWL, RDF, RDF Schema (inaczej RDFS). Znaczenia zasobów informacyjnych określa się za pomocą tzw. ontologii. Sieć semantyczna jest wizją Tima Bernersa-Lee (twórcy standardu WWW i pierwszej przeglądarki internetowej, a także przewodniczącego W3C). W swoich założeniach sieć semantyczna ma korzystać z istniejącego protokołu komunikacyjnego, na którym bazuje dzisiejszy Internet. Różnica miałaby polegać na tym, że przesyłane dane mogłyby być 'rozumiane' także przez maszyny. Owo 'rozumienie' polegałoby na tym, że dane przekazywane byłyby w postaci, w której można by powiązać ich znaczenia między sobą a także w ramach odpowiedniego kontekstu. Informacje przekazywane w ramach sieci semantycznej wymagałyby nie tylko samych danych, ale także informacji o tychże (tzw. meta-danych). To właśnie meta-dane zawierałyby sformułowania dotyczące relacji między danymi oraz prawa logiki, które można do nich zastosować. Dzięki temu można by: 
*  powiązać różne dane znajdujące się w Internecie w ramach wspólnych jednostek znaczeniowych (np. strony dotyczące filmów, dziedzin nauki, kuchni francuskiej, etc.) 
*  rozróżnić dane, które dla maszyn są w tej chwili nierozróżnialne ze względu na identyczny zapis tekstowy (np. zamek - urządzenie do zamykania drzwi; urządzenie do łączenia w ustalonym położeniu elementów ubrania; okazała budowla mieszkalno-obronna) 
*  przeprowadzać na tychże danych wnioskowania, tzn. otrzymywać informacje na ich temat, które nie są zawarte explicite (np. na podstawie danej "Ewa jest żoną Adama", możemy też dowiedzieć się, że Ewa jest kobietą, Adam mężczyzną, Adam jest mężem Ewy, żaden inny mężczyzna nie jest mężem Ewy, etc.)"""@pl,
        "A Web semântica é uma extensão da World Wide Web atual, que permitirá aos computadores e humanos trabalharem em cooperação. A Web semântica interliga significados de palavras e, neste âmbito, tem como finalidade conseguir atribuir um significado (sentido) aos conteúdos publicados na Internet de modo que seja perceptível tanto pelo humano como pelo computador. A ideia da Web Semântica surgiu em 2001, quando Tim Berners-Lee, James Hendler e Ora Lassila publicaram um artigo na revista Scientific American, intitulado: “Web Semântica: um novo formato de conteúdo para a Web que tem significado para computadores vai iniciar uma revolução de novas possibilidades.” A web semântica é a relação de interatividade do homem e o computador, onde um depende do outro para a conclusão de tarefas, assim acepção de entendimento do comando estipulado do ser humano à interface operacional da maquina dando um significado de ordem a ser executada. Sendo desta forma uma espécie de escrita de entendimento tanto para o computador e para usuário, por meio de organização das informações contida na máquina, através do seu perfil de suas últimas pesquisas realizadas, originando um repositório de dados lincados, como se fosse um verbete de enciclopédia. Podemos fazer uma assimilação da web semântica com a Ciência da Informação, pelo fato de possuir a ideia estrutural de arranjo sistêmico, agrupando um conjunto de coleta de análise, classificação, armazenamento, disseminação e recuperação de informação como se fosse uma enciclopédia. O objetivo principal da web semântica não é, pelo menos para já, treinar as máquinas para que se comportem como pessoas, mas sim desenvolver tecnologias e linguagens que tornem a informação legível para as máquinas. A finalidade passa pelo desenvolvimento de um modelo tecnológico que permita a partilha global de conhecimento assistido por máquinas (W3C 2001). A integração das linguagens ou tecnologias eXtensible Markup Language (XML), Resource Description Framework (RDF), arquiteturas de metadados, ontologias, agentes computacionais, entre outras, favorecerá o aparecimento de serviços Web que garantam a interoperabilidade e cooperação. Ultimamente tem-se associado a Web Semântica à Web 3.0, como um próximo movimento da internet depois da Web 2.0 que já inicia seu crescimento."@pt,
        "Семанти́ческая паути́на (англ. semantic web) — это общедоступная глобальная семантическая сеть, формируемая на базе Всемирной паутины путём стандартизации представления информации в виде, пригодном для машинной обработки. В обычной Всемирной паутине, основанной на HTML-страницах, информация заложена в тексте страниц и предназначена для чтения и понимания человеком. Семантическая паутина состоит из машинно-читаемых элементов — узлов семантической сети, с опорой на онтологии. Благодаря этому программы-клиенты получают возможность непосредственно получать из интернета утверждения вида «предмет — вид взаимосвязи — другой предмет» и вычислять по ним логические заключения. Семантическая паутина работает параллельно с обычной Всемирной паутиной и на её основе, используя протокол HTTP и идентификаторы ресурсов URI. Название «Семантическая паутина» было впервые введено сэром Тимом Бернерсом-Ли (изобретателем Всемирной паутины) в сентябре 1998 года, и называется им «следующим шагом в развитии Всемирной паутины». Позже в своём блоге он предложил в качестве синонима термин «гигантский глобальный граф» (англ. giant global graph, GGG, по аналогии с WWW). Концепция семантической паутины была принята и продвигается консорциумом Всемирной паутины."@ru,
        """语义网(Semantic Web)是由万维网联盟的蒂姆·伯纳斯-李(Tim Berners-Lee)在1998年提出的一个概念,它的核心是:通过给万维网上的文档(如: HTML)添加能够被计算机所理解的语义(Meta data),从而使整个互联网成为一个通用的信息交换媒介。语义万维网通过使用标准、置标语言和相关的处理工具来扩展万维网的能力。不过语意网概念实际上是基于很多已有技术的,也依赖于后来和text-and-markup与知识表现的综合。那些渊源甚至可以追溯到20世纪60年代末期的Allan M. Collins、M. Ross Quillian、Elizabeth F. Loftus等人的研究,还有之后70年代初R.F.Simon、R.C.Schamk、Minsky等人陆续提出的一些理论上的成果,其中Simon在进行自然语言理解的应用研究时提出了语义网络Semantic Network(不是现在的Semantic Web)的概念。当时人们甚至发明了以逻辑为基础的程序设计语言Prolog。 "语义"网是由比现今成熟的网际搜索工具更加行之有效的、更加广泛意义的并且自动聚集和搜集信息的文档组成的。其最基本的元素就是语义链接。 通过下列方法可以提升全球資訊網以及其互连的资源的易用性(usability)和實用性(usefulness): 
* "标记"了语义信息的文档。这可以是机器可以理解的关于文档内容(例如文档的作者,标题,简介等)的描述,或者是描述该网站所拥有的服务和资源.(注意:任何东西都是能被URI-统一资源定位符-所描述的,因此语义网能理解人物、地方、想法、類別等等) 
* 通用元数据詞滙表(本体论)及詞滙間的影射使得文檔作者知道如何來標記文檔方可讓機器識別他想提供的元數據. 
* 利用元数据为语义网用户执行任务的自动软件代理(agent). 
* 為自動軟件代理提供特定信息的網絡服务 (例如,可信度服務可以讓軟件代理查詢某個在线商店是否曾經有過不良紀錄或者發送過垃圾郵件)."""@zh ;
    dbo:thumbnail <http://commons.wikimedia.org/wiki/Special:FilePath/RDF_example.svg?width=300> ;
    dbo:wikiPageExternalLink <http://esw.w3.org/topic/ConverterToRdf>,
        <http://www-sop.inria.fr/acacia/soft/corese/>,
        <http://www.amazon.com/gp/product/0470396792>,
        <http://www.semantic-web-book.org>,
        <http://www.springer.com/computer/database+management+%26+information+retrieval/book/978-3-662-43795-7>,
        <http://www.w3.org/2005/Incubator/urw3/XGR-urw3-20080331/>,
        <http://www.w3.org/standards/semanticweb/> ;
    dbo:wikiPageID 29123 ;
    dbo:wikiPageRevisionID 741952532 ;
    dbp:b "no"^^rdf:langString ;
    dbp:commons "Category:Semantic Web"^^rdf:langString ;
    dbp:d "Q54837"^^rdf:langString ;
    dbp:n "no"^^rdf:langString ;
    dbp:q "no"^^rdf:langString ;
    dbp:s "no"^^rdf:langString ;
    dbp:v "no"^^rdf:langString ;
    dbp:wikt "no"^^rdf:langString ;
    dct:subject <http://dbpedia.org/resource/Category:Buzzwords>,
        <http://dbpedia.org/resource/Category:Emerging_technologies>,
        <http://dbpedia.org/resource/Category:Internet_ages>,
        <http://dbpedia.org/resource/Category:Knowledge_engineering>,
        <http://dbpedia.org/resource/Category:Semantic_Web>,
        <http://dbpedia.org/resource/Category:Web_services> ;
    ns8:hypernym <http://dbpedia.org/resource/Extension> ;
    rdfs:comment "إن ورود المعلومات على الإنترنت يزداد بشكل كبير، فقد أصبح الإنترنت مكانًا للتعبير عن الأفكار، سرد القصص، إنشاء المدونات ومشاركة الفيديوهات والصور والملفات الصوتية وما إلى ذلك. وهو ما جعل كمّ المعلومات المتوفرة للفرد الواحد أكبر بكثير ممايُمكن له أن يستفيد منه. تعريض العقل البشري لهذا الكم الهائل من المعلومات من شأنه أن يتسبب فيما يُمكن أن نصفه بوصف \"الضياع في فضاء المعلومات\"، وذلك راجع إلى بقاء المعلومات المفيدة بعيدة المنال بسبب تراكم الكثير من المعلومات غير المفيدة وغير المرتبطة بالموضوع المراد البحث عنه من قبل المستخدم.لحسن الحظ، مثلما يزداد ورود المعلومات، تزداد مقدرات معالجة المعلومات اوتوماتيكياً، لذا يوجد إمكانيات كبيرة للاستفادة من مقدرات الأتمتة هذه بهدف استخراج المعلومات والخدمات من فيضان الويب والمرتبطة بالمستخدم، وتوصيلها إليه عن طريق واجهة مستخدم معيارية (Standardized User Inte"@ar,
        "Das Semantic Web erweitert das Web, um Daten zwischen Rechnern einfacher austauschbar und für sie einfacher verwertbar zu machen; so kann beispielsweise der Begriff „Bremen“ in einem Webdokument um die Information ergänzt werden, ob hier ein Schiffs-, Familien- oder der Stadtname gemeint ist. Diese zusätzlichen Informationen explizieren die sonst nur unstrukturiert vorkommenden Daten. Zur Realisierung dienen Standards zur Veröffentlichung und Nutzung maschinenlesbarer Daten (insbesondere RDF)."@de,
        "The Semantic Web is an extension of the Web through standards by the World Wide Web Consortium (W3C). The standards promote common data formats and exchange protocols on the Web, most fundamentally the Resource Description Framework (RDF). The 2001 Scientific American article by Berners-Lee, Hendler, and Lassila described an expected evolution of the existing Web to a Semantic Web. In 2006, Berners-Lee and colleagues stated that: \"This simple idea…remains largely unrealized\".In 2013, more than four million Web domains contained Semantic Web markup."@en,
        "La web semántica (del inglés semantic web) es un conjunto de actividades desarrolladas en el seno de World Wide Web Consortium con tendencia a la creación de tecnologías para publicar datos legibles por aplicaciones informáticas (máquinas en la terminología de la Web semántica). Se basa en la idea de añadir metadatos semánticos y ontológicos a la World Wide Web. Esas informaciones adicionales —que describen el contenido, el significado y la relación de los datos— se deben proporcionar de manera formal, para que así sea posible evaluarlas automáticamente por máquinas de procesamiento. El objetivo es mejorar Internet ampliando la interoperabilidad entre los sistemas informáticos usando \"agentes inteligentes\". Agentes inteligentes son programas en las computadoras que buscan información sin o"@es,
        "Le Web sémantique, ou toile sémantique, est une extension du Web standardisée par le World Wide Web Consortium (W3C). Ces standards encouragent l'utilisation de formats de données et de protocoles d'échange normés sur le Web, avec comme format de base le Resource Description Framework (RDF)."@fr,
        "Con il termine web semantico, termine coniato dal suo ideatore, Tim Berners-Lee, si intende la trasformazione del World Wide Web in un ambiente dove i documenti pubblicati (pagine HTML, file, immagini, e così via) sono associati ad informazioni e dati (metadati) che ne specificano il contesto semantico in un formato adatto all'interrogazione e l'interpretazione (es. tramite motori di ricerca) e, più in generale, all'elaborazione automatica."@it,
        "セマンティック・ウェブ(英: semantic web)は W3C のティム・バーナーズ=リーによって提唱された、ウェブページの意味を扱うことを可能とする標準やツール群の開発によってワールド・ワイド・ウェブの利便性を向上させるプロジェクト。セマンティック・ウェブの目的はウェブページの閲覧という行為に、データの交換の側面に加えて意味の疎通を付け加えることにある。 現在のワールド・ワイド・ウェブ上のコンテンツは主にHTMLで記述されている。HTMLでは文書構造を伝えることは可能だが、個々の単語の意味をはじめとする詳細な意味を伝えることはできない。これに対し、セマンティック・ウェブはXMLによって記述した文書にRDFやOWLを用いてタグを付け加える。この、データの意味を記述したタグが文書の含む意味を形式化し、コンピュータによる自動的な情報の収集や分析へのアプローチが可能となると期待されている。オントロジーを扱う階層まではW3Cにより標準化されているが、それ以上の階層の開発は難しいため、実現と標準化には長期間掛かると予想されている。また、既存のWebサイトに対するメタデータ付与の作業が必要であるため、Web全域への普及に関しても長期間掛かると予想されている。"@ja,
        "Het semantisch web verschaft een standaardframework waarmee data gedeeld en hergebruikt kunnen worden. Het is een samenwerking onder leiding van het internationale orgaan voor internetstandaarden, het World Wide Web Consortium (W3C). Het semantisch web is geen synoniem voor Web 2.0, zoals soms wel wordt verondersteld. Tim Berners-Lee beschreef het semantische web als een component van 'Web 3.0'. Soms wordt het gebruikt als synoniem voor Web 3.0, hoewel de definities verschillen."@nl,
        "Semantic Web (sieci semantyczne) – projekt, który ma przyczynić się do utworzenia i rozpowszechnienia standardów opisywania treści w Internecie w sposób, który umożliwi maszynom i programom (np. tzw. agentom) przetwarzanie informacji w sposób odpowiedni do ich znaczenia. Wśród standardów sieci semantycznych znajdują się m.in. OWL, RDF, RDF Schema (inaczej RDFS). Znaczenia zasobów informacyjnych określa się za pomocą tzw. ontologii."@pl,
        "A Web semântica é uma extensão da World Wide Web atual, que permitirá aos computadores e humanos trabalharem em cooperação. A Web semântica interliga significados de palavras e, neste âmbito, tem como finalidade conseguir atribuir um significado (sentido) aos conteúdos publicados na Internet de modo que seja perceptível tanto pelo humano como pelo computador. A ideia da Web Semântica surgiu em 2001, quando Tim Berners-Lee, James Hendler e Ora Lassila publicaram um artigo na revista Scientific American, intitulado: “Web Semântica: um novo formato de conteúdo para a Web que tem significado para computadores vai iniciar uma revolução de novas possibilidades.”"@pt,
        "Семанти́ческая паути́на (англ. semantic web) — это общедоступная глобальная семантическая сеть, формируемая на базе Всемирной паутины путём стандартизации представления информации в виде, пригодном для машинной обработки."@ru,
        "语义网(Semantic Web)是由万维网联盟的蒂姆·伯纳斯-李(Tim Berners-Lee)在1998年提出的一个概念,它的核心是:通过给万维网上的文档(如: HTML)添加能够被计算机所理解的语义(Meta data),从而使整个互联网成为一个通用的信息交换媒介。语义万维网通过使用标准、置标语言和相关的处理工具来扩展万维网的能力。不过语意网概念实际上是基于很多已有技术的,也依赖于后来和text-and-markup与知识表现的综合。那些渊源甚至可以追溯到20世纪60年代末期的Allan M. Collins、M. Ross Quillian、Elizabeth F. Loftus等人的研究,还有之后70年代初R.F.Simon、R.C.Schamk、Minsky等人陆续提出的一些理论上的成果,其中Simon在进行自然语言理解的应用研究时提出了语义网络Semantic Network(不是现在的Semantic Web)的概念。当时人们甚至发明了以逻辑为基础的程序设计语言Prolog。 \"语义\"网是由比现今成熟的网际搜索工具更加行之有效的、更加广泛意义的并且自动聚集和搜集信息的文档组成的。其最基本的元素就是语义链接。 通过下列方法可以提升全球資訊網以及其互连的资源的易用性(usability)和實用性(usefulness):"@zh ;
    owl:sameAs <http://cs.dbpedia.org/resource/Sémantický_web>,
        <http://d-nb.info/gnd/4688372-1>,
        <http://dbpedia.org/resource/Semantic_Web>,
        <http://de.dbpedia.org/resource/Semantic_Web>,
        <http://el.dbpedia.org/resource/Σημασιολογικός_Ιστός>,
        <http://es.dbpedia.org/resource/Web_semántica>,
        <http://eu.dbpedia.org/resource/Web_semantiko>,
        <http://fr.dbpedia.org/resource/Web_sémantique>,
        <http://id.dbpedia.org/resource/Web_semantik>,
        <http://it.dbpedia.org/resource/Web_semantico>,
        <http://ja.dbpedia.org/resource/セマンティック・ウェブ>,
        <http://ko.dbpedia.org/resource/시맨틱_웹>,
        <http://nl.dbpedia.org/resource/Semantisch_web>,
        <http://pl.dbpedia.org/resource/Semantic_Web>,
        <http://pt.dbpedia.org/resource/Web_semântica>,
        <http://rdf.freebase.com/ns/m.076k0>,
        <http://rdf.freebase.com/ns/m.0bbv9w2>,
        <http://wikidata.dbpedia.org/resource/Q54837>,
        <http://www.wikidata.org/entity/Q54837>,
        <http://yago-knowledge.org/resource/Semantic_Web> ;
    prov:wasDerivedFrom <http://en.wikipedia.org/wiki/Semantic_Web?oldid=741952532> ;
    foaf:depiction <http://commons.wikimedia.org/wiki/Special:FilePath/RDF_example.svg> ;
    foaf:homepage <http://www.w3.org/standards/semanticweb/> ;
    foaf:isPrimaryTopicOf <http://en.wikipedia.org/wiki/Semantic_Web> .


Для подстановки пользовательских литералов в SPARQL-запрос можно использовать сериализацию литералов rdflib.

In [162]:
rdflib.URIRef('http://ya.ru/rdf').n3()
Out[162]:
u'<http://ya.ru/rdf>'
In [14]:
rdflib.Literal(2 ** 100).n3()
Out[14]:
u'"1267650600228229401496703205376"^^<http://www.w3.org/2001/XMLSchema#integer>'
In [13]:
rdflib.Literal('hello\0"Привет', lang='ru').n3()
Out[13]:
u'"hello\x00\\"\u041f\u0440\u0438\u0432\u0435\u0442"@ru'
In [15]:
import datetime
rdflib.Literal(datetime.datetime.now()).n3()
Out[15]:
u'"2018-05-18T13:32:41.819000"^^<http://www.w3.org/2001/XMLSchema#dateTime>'
In [23]:
import pymysql, pandas
conn = pymysql.connect(
    host='localhost', user='root', password='toor', db='bookwarrior',
    charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)
df = pandas.read_sql('SELECT * FROM updated WHERE Id <= 1000', conn)
data = df.to_dict('records')
print len(data)
1000
In [52]:
class Blazegraph:
    def __init__(self, endpoint='http://localhost:9999/blazegraph/namespace/kb/sparql'):
        self.db = SPARQLWrapper.SPARQLWrapper(endpoint)
    def send(self, sparql):
        self.db.setQuery(sparql)
        self.db.method = 'POST'
        self.db.setReturnFormat(SPARQLWrapper.JSON)
        return self.db.query()
    def from_sparql_response(self, v):
        if 'datatype' in v and v['datatype'] == 'http://www.w3.org/2001/XMLSchema#integer':
            return int(v['value'])
        else:
            return v['value']
    def query(self, sparql):
        results = self.send(sparql).convert()
        return [{k: self.from_sparql_response(v) for k,v in result.iteritems()} for result in results["results"]["bindings"]]
    def execute(self, sparql):
        return self.send(sparql).response.read()
In [58]:
import os
In [55]:
%%time
bg = Blazegraph()
for rec in data:
    subj = 'http://gen.lib.rus.ec/book/index.php?md5=%s' % rec['MD5'].upper()
    sparql_props = ['lg:%s %s' % (k, rdflib.Literal(v).n3()) for k, v in rec.items() if v != '']
    sparql = '''
        PREFIX lg: <http://gen.lib.rus.ec/#>
        INSERT DATA { %s ''' % rdflib.URIRef(subj).n3() + ';\n'.join(sparql_props) + ' . }'
    bg.queryUpdate(sparql)
Wall time: 4min 9s
In [56]:
bg.query('SELECT (COUNT(?s) AS ?c) WHERE { ?s ?p ?o . }')
Out[56]:
[{u'c': 26647}]
In [60]:
os.path.getsize("C:\\Temp\\blazegraph\\blazegraph.jnl")
Out[60]:
1184866800L

Вставка 1000 инсертами 26647 триплов 249 сек, вес БД 1.18 ГБ.

In [67]:
triples = []
for i, rec in enumerate(data):
    subj = 'http://gen.lib.rus.ec/book/index.php?md5=%s' % rec['MD5'].upper()
    sparql_props = ['lg:%s %s' % (k, rdflib.Literal(v).n3()) for k, v in rec.items() if v != '']
    sparql = '%s ' % rdflib.URIRef(subj).n3() + ';\n'.join(sparql_props) + ' .'
    triples.append(sparql)
In [68]:
len(triples)
Out[68]:
1000
In [64]:
%%time
bg = Blazegraph()
for rec in data:
    subj = 'http://gen.lib.rus.ec/book/index.php?md5=%s' % rec['MD5'].upper()
    for k, v in rec.items():
        if v != '':
            sparql = '''
                PREFIX lg: <http://gen.lib.rus.ec/#>
                INSERT DATA { %s %s %s . }''' % (rdflib.URIRef(subj).n3(), 'lg:%s' % k, rdflib.Literal(v).n3())
            bg.queryUpdate(sparql)
---------------------------------------------------------------------------
KeyboardInterrupt                         Traceback (most recent call last)
<ipython-input-64-928196c62335> in <module>()
----> 1 get_ipython().run_cell_magic(u'time', u'', u"bg = Blazegraph()\nfor rec in data:\n    subj = 'http://gen.lib.rus.ec/book/index.php?md5=%s' % rec['MD5'].upper()\n    for k, v in rec.items():\n        if v != '':\n            sparql = '''\n                PREFIX lg: <http://gen.lib.rus.ec/#>\n                INSERT DATA { %s %s %s . }''' % (rdflib.URIRef(subj).n3(), 'lg:%s' % k, rdflib.Literal(v).n3())\n            bg.queryUpdate(sparql)")

C:\Users\User\Anaconda2\lib\site-packages\IPython\core\interactiveshell.pyc in run_cell_magic(self, magic_name, line, cell)
   2291             magic_arg_s = self.var_expand(line, stack_depth)
   2292             with self.builtin_trap:
-> 2293                 result = fn(magic_arg_s, cell)
   2294             return result
   2295 

<decorator-gen-61> in time(self, line, cell, local_ns)

C:\Users\User\Anaconda2\lib\site-packages\IPython\core\magic.pyc in <lambda>(f, *a, **k)
    191     # but it's overkill for just that one bit of state.
    192     def magic_deco(arg):
--> 193         call = lambda f, *a, **k: f(*a, **k)
    194 
    195         if callable(arg):

C:\Users\User\Anaconda2\lib\site-packages\IPython\core\magics\execution.pyc in time(self, line, cell, local_ns)
   1165         else:
   1166             st = clock2()
-> 1167             exec(code, glob, local_ns)
   1168             end = clock2()
   1169             out = None

<timed exec> in <module>()

<ipython-input-52-60bbb0b1d33f> in queryUpdate(self, sparql)
     18         return [{k: self.from_sparql_response(v) for k,v in result.iteritems()} for result in results["results"]["bindings"]]
     19     def queryUpdate(self, sparql):
---> 20         self.send(sparql)

<ipython-input-52-60bbb0b1d33f> in send(self, sparql)
      6         self.db.method = 'POST'
      7         self.db.setReturnFormat(SPARQLWrapper.JSON)
----> 8         return self.db.query()
      9     def execute(self, sparql):
     10         return self.send(sparql).response.read()

C:\Users\User\Anaconda2\lib\site-packages\SPARQLWrapper\Wrapper.pyc in query(self)
    599             @rtype: L{QueryResult} instance
    600         """
--> 601         return QueryResult(self._query())
    602 
    603     def queryAndConvert(self):

C:\Users\User\Anaconda2\lib\site-packages\SPARQLWrapper\Wrapper.pyc in _query(self)
    569 
    570         try:
--> 571             response = urlopener(request)
    572             return response, self.returnFormat
    573         except urllib2.HTTPError, e:

C:\Users\User\Anaconda2\lib\urllib2.pyc in urlopen(url, data, timeout, cafile, capath, cadefault, context)
    152     else:
    153         opener = _opener
--> 154     return opener.open(url, data, timeout)
    155 
    156 def install_opener(opener):

C:\Users\User\Anaconda2\lib\urllib2.pyc in open(self, fullurl, data, timeout)
    427             req = meth(req)
    428 
--> 429         response = self._open(req, data)
    430 
    431         # post-process response

C:\Users\User\Anaconda2\lib\urllib2.pyc in _open(self, req, data)
    445         protocol = req.get_type()
    446         result = self._call_chain(self.handle_open, protocol, protocol +
--> 447                                   '_open', req)
    448         if result:
    449             return result

C:\Users\User\Anaconda2\lib\urllib2.pyc in _call_chain(self, chain, kind, meth_name, *args)
    405             func = getattr(handler, meth_name)
    406 
--> 407             result = func(*args)
    408             if result is not None:
    409                 return result

C:\Users\User\Anaconda2\lib\urllib2.pyc in http_open(self, req)
   1226 
   1227     def http_open(self, req):
-> 1228         return self.do_open(httplib.HTTPConnection, req)
   1229 
   1230     http_request = AbstractHTTPHandler.do_request_

C:\Users\User\Anaconda2\lib\urllib2.pyc in do_open(self, http_class, req, **http_conn_args)
   1199         else:
   1200             try:
-> 1201                 r = h.getresponse(buffering=True)
   1202             except TypeError: # buffering kw not supported
   1203                 r = h.getresponse()

C:\Users\User\Anaconda2\lib\httplib.pyc in getresponse(self, buffering)
   1134 
   1135         try:
-> 1136             response.begin()
   1137             assert response.will_close != _UNKNOWN
   1138             self.__state = _CS_IDLE

C:\Users\User\Anaconda2\lib\httplib.pyc in begin(self)
    451         # read until we get a non-100 response
    452         while True:
--> 453             version, status, reason = self._read_status()
    454             if status != CONTINUE:
    455                 break

C:\Users\User\Anaconda2\lib\httplib.pyc in _read_status(self)
    407     def _read_status(self):
    408         # Initialize with Simple-Response defaults
--> 409         line = self.fp.readline(_MAXLINE + 1)
    410         if len(line) > _MAXLINE:
    411             raise LineTooLong("header line")

C:\Users\User\Anaconda2\lib\socket.pyc in readline(self, size)
    478             while True:
    479                 try:
--> 480                     data = self._sock.recv(self._rbufsize)
    481                 except error, e:
    482                     if e.args[0] == EINTR:

KeyboardInterrupt: 
In [65]:
bg.query('SELECT (COUNT(?s) AS ?c) WHERE { ?s ?p ?o . }')
Out[65]:
[{u'c': 2043}]

Вставка инсертом на каждый трипл ? триплов ? сек

Разосрался до 2 ГБ, почти ничего не вставив.

todo Некомплиментарненько

In [69]:
%%time
bg = Blazegraph()
step = 10
for i in range(0, len(triples), step):
    sparql = '''
        PREFIX lg: <http://gen.lib.rus.ec/#>
        INSERT DATA { ''' + '\n'.join(triples[i : i + step]) + ''' }'''
    bg.queryUpdate(sparql)
Wall time: 31.5 s
In [71]:
print bg.query('SELECT (COUNT(?s) AS ?c) WHERE { ?s ?p ?o . }')
print os.path.getsize("C:\\Temp\\blazegraph\\blazegraph.jnl")
[{u'c': 26647}]
144700736
In [80]:
%%time
bg = Blazegraph()
step = 100
for i in range(0, len(triples), step):
    sparql = '''
        PREFIX lg: <http://gen.lib.rus.ec/#>
        DISABLE ENTAILMENTS;
        INSERT DATA { ''' + '\n'.join(triples[i : i + step]) + ''' }'''
    bg.queryUpdate(sparql)
Wall time: 1.82 s
In [81]:
print bg.query('SELECT (COUNT(?s) AS ?c) WHERE { ?s ?p ?o . }')
print os.path.getsize("C:\\Temp\\blazegraph\\blazegraph.jnl")
[{u'c': 26555}]
44039504
In [86]:
%%time
bg = Blazegraph()
step = 1
for i in range(0, len(triples), step):
    sparql = '''
        PREFIX lg: <http://gen.lib.rus.ec/#>
        INSERT DATA { ''' + '\n'.join(triples[i : i + step]) + ''' }'''
    bg.queryUpdate(sparql)
Wall time: 17.1 s
In [85]:
print bg.query('SELECT (COUNT(?s) AS ?c) WHERE { ?s ?p ?o . }')
print os.path.getsize("C:\\Temp\\blazegraph\\blazegraph.jnl")
[{u'c': 26555}]
1184866800
In [74]:
g = rdflib.Graph()
for i, rec in enumerate(data):
    for k, v in rec.items():
        if v != '':
            s = 'http://gen.lib.rus.ec/book/index.php?md5=%s' % rec['MD5'].upper()
            p = 'http://gen.lib.rus.ec/#%s' % k
            o = v
            g.add((rdflib.URIRef(s), rdflib.URIRef(p), rdflib.Literal(o)))
In [76]:
len(g)
Out[76]:
26368
In [79]:
g.serialize('libgen1000.ttl', format='turtle')

Загрузка этого файла с вкладки Update в Blazegraph Workbench: modified: 26368 milliseconds: 1888, 10.5 МБ

Поскольку SPARQL-запросы существенно свободнее по форме по сравнению с SQL, семантическая БД при изменениях вынуждена перестраивать куда более заметное количество индексов, что приводит к скорости вставки порядка 100 триплов в секунду. Большинство осмысленных данных значительно больше, поэтому их обычно загружают в семантическую БД в пакетном режиме, из файла.

todo как заливать в blazegraph ttl, как генерить и читать ttl из питона, как делать запросы с квадами

todo как запретить rules.log?

todo Пример CONSTRUCT, парсинга rdflib, оперирования с rdflib.Graph

Примеры запросов вставки и удаления:

INSERT DATA {
  <http://example/book3> dc:title    "A new book" ;
                         dc:creator  "A.N.Other" .
}
DELETE { ?book ?p ?v } WHERE {
  ?book dc:date ?date .
  FILTER ( ?date < "2000-01-01T00:00:00"^^xsd:dateTime )
  ?book ?p ?v
}

Документы

PDF

PyPDF2 (1.26.0)
reportlab -- писать в PDF, векторная графика и все такое
https://github.com/pmaupin/pdfrw pure Python library that reads and writes PDFs

MS Word

doc?

pip install python-docx

from docx import Document
from docx.shared import Inches

guestnames=['Иван', 'Олег', 'Ольга', 'Мария и Александр']

for x in guestnames:
    document = Document()
    document.add_heading('Приглашение на свадьбу', 0)
    p = document.add_paragraph(x+', спешим пригласить Вас на свадьбу') 
    p.add_run(' Татьяны и Дмитрия Раутенко').bold = True
    p.add_run(', которая состоится 12.05.2017 в усадьбе Тихая роща.')
    document.add_heading('Мы ждём вас, на наш праздник!!!', level=1)
    document.add_paragraph('')
    document.add_picture('1.jpg', width=Inches(5.25))
    document.add_page_break()
    document.save(x+'.docx')

MS Excel

xlrd

OpenDocument

PyUNO

textract

textract
    .doc via antiword
    .docx via python-docx
    .csv .eml .json .odt .txt via python builtins
    .epub via ebooklib
    .gif .jpg .jpeg .png .tiff .tif via tesseract-ocr
    .html and .htm via beautifulsoup4
    .mp3 .ogg .wav via SpeechRecognition and sox
    .msg via msg-extractor
    .pdf via pdftotext (default) or pdfminer.six
    .pptx via python-pptx
    .ps via ps2text
    .rtf via unrtf
    .xls .xlsx via xlrd

DjVu

Для работы с популярным форматов сканов DjVu можно использовать библиотеку python-djvulibre.

http://djvu.sourceforge.net/ качаем Source TAR.GZ djvulibre-3.5.27.tar.gz
распаковываем

http://libjpeg.sourceforge.net/ распаковываем в c:\Temp\djvulibre-3.5.27\win32\jpeg\jpeg-6b\

"C:\Temp\djvulibre-3.5.27\win32\djvulibre\djvulibre.sln" билдим release x64

переименовываем djvulibre-3.5.27/win32/djvulibre/x64/Release/libdjvulibre.lib в djvulibre.lib

pip install python-djvulibre --global-option build_ext --global-option --compiler=msvc --global-option "--include-dirs=c:/Temp/djvulibre-3.5.27"     --global-option "--library-dirs=c:/Temp/djvulibre-3.5.27/win32/djvulibre/x64/Release"

скопировать libdjvulibre.dll и libjpeg.dll в Anaconda2\Lib\site-packages\djvu\
In [12]:
import djvu
import djvu.decode
import numpy
In [13]:
%pylab inline
Populating the interactive namespace from numpy and matplotlib
In [14]:
filename = 'D:\\(library)\\(__Unsorted)\\P. J. Plauger Programming on purpose III essays on software technology  1994.djvu'
In [15]:
djvu_pixel_format = djvu.decode.PixelFormatRgbMask(0xff0000, 0xff00, 0xff, bpp=32)
djvu_pixel_format.rows_top_to_bottom = 1
djvu_pixel_format.y_top_to_bottom = 0
img = None

class Context(djvu.decode.Context):
    def handle_message(self, message):
        if isinstance(message, djvu.decode.ErrorMessage):
            print message
            # Exceptions in handle_message() are ignored, so sys.exit() wouldn't work here.
            os._exit(1)

    def process(self, djvu_path, mode):
        document = self.new_document(djvu.decode.FileURI(djvu_path))
        document.decoding_job.wait()
        page = document.pages[2]
        page_job = page.decode(wait=True)
        width, height = page_job.size
        print width, height
        rect = (0, 0, width, height)
        color_buffer = numpy.zeros((height, width), dtype=numpy.uint32)
        page_job.render(mode, rect, rect, djvu_pixel_format, row_alignment=1, buffer=color_buffer)
        return color_buffer

context = Context()
img = context.process(filename, djvu.decode.RENDER_COLOR) # RENDER_FOREGROUND RENDER_BACKGROUND RENDER_MASK_ONLY
3250 5010

todo что это?

#mask_buffer = numpy.zeros((height, bytes_per_line), dtype=numpy.uint32)
#if mode == djvu.decode.RENDER_FOREGROUND:
#    page_job.render(djvu.decode.RENDER_MASK_ONLY, rect, rect, djvu_pixel_format, row_alignment=1, buffer=mask_buffer)
#    mask_buffer <<= 24
#    color_buffer |= mask_buffer
#color_buffer ^= 0xff000000
#surface.write_to_png(png_path)
In [16]:
img3d = zeros((img.shape[0], img.shape[1], 3), dtype=uint8)
img3d[:,:,0] = img >> 16
img3d[:,:,1] = (img >> 8) & 0xFF
img3d[:,:,2] = img & 0xFF
In [17]:
figure(figsize=(16, 20))
xticks([]); yticks([])
imshow(img3d, interpolation='bilinear');

OCR

Распознать скан может помочь библиотека pyocr, являющаяся враппером над open-source OCR Tesseract от Google.

скачать и поставить https://github.com/tesseract-ocr/tesseract/wiki/Downloads#binaries-for-windows
    указать инсталлеру скачать rus training
добавить в PATH

pip install pyocr
In [108]:
import pyocr
In [114]:
for tool in pyocr.get_available_tools():
    print tool.get_name(), tool.get_available_languages()
 Tesseract (sh) [u'eng', u'osd', u'rus']
In [ ]:
from PIL import Image
im = Image.fromarray(img3d)
In [118]:
%%time
ocred = tool.image_to_string(im)
Wall time: 10.3 s
In [119]:
ocred
Out[119]:
u'Acquisitions editor: Paul Becker\n\nEditorial assistant: Noreen Regina\n\nCover design director: Eloise Starkweather\nCover designer: Lundgren Graphics\nManufacturing buyer: Mary E. McCartney\n\n\xa91994 by P.J. Plauger\n\nPublished by PTR Prentice-Hall, Inc.\nA Simon & Schuster Company\n\nEnglewood Cliffs, New Jersey 07632\n\n \n\nAll rights reserved. No part of this book may be reproduced,\nin any form or by any means, without permission in writing\nof the author.\n\nThe publisher offers discounts on this book when ordered in\n\nbulk quantities. For more information, contact Corporate Sales Department,\nPTR Prentice Hall, 113 Sylvan Avenue, Englewood Cliffs, NJ 07632.\nPhone: 201-592-2863; FAX: 201-592-2249.\n\nPrinted in the United States of America\n10 9 8 7 6 5 4 3 2 1\n\nISBN - O-13-328113-2\n\nPrentice-Hall International (UK) Limited, London\nPrentice-Hall of Australia, Pty. Limited, Sydney\nPrentice-Hall Canada Inc., Toronto\n\nPrentice-Hall Hispanoamericana, S.A., Mexico\nPrentice-Hall of India Private Limited, New Delhi\nPrentice-Hall of Japan, Inc., Tokyo\n\nSimon & Schuster Asia Pte. Ltd., Singapore\n\nEditora Prentice-Hall do Brazil, Ltda., Rio de Janeiro'
In [149]:
mine = u'''Acquisitions editor: Paul Becker
Editorial assistant: Noreen Regina
Cover design director: Eloise Starkweather
Cover designer: Lundgren Graphics
Manufacturing buyer: Mary E. McCartney

©1994 by P.J. Plauger

Published by PTR Prentice-Hall, Inc.
A Simon & Schuster Company
Englewood Cliffs, New Jersey 07632

All rights reserved. No part of this book may be reproduced,
in any form or by any means, without permission in writing
of the author.

The publisher offers discounts on this book when ordered in
bulk quantities. For more information, contact Corporate Sales Department,
PTR Prentice Hall, 113 Sylvan Avenue, Englewood Cliffs, NJ 07632.
Phone: 201-592-2863; FAX: 201-592-2249.

Printed in the United States of America
10 9 8 7 6 5 4 3 2 1

ISBN 0-13-328113-2

Prentice-Hall International (UK) Limited, London
Prentice-Hall of Australia, Pty. Limited, Sydney
Prentice-Hall Canada Inc., Toronto
Prentice-Hall Hispanoamericana, S.A., Mexico
Prentice-Hall of India Private Limited, New Delhi
Prentice-Hall of Japan, Inc., Tokyo
Simon & Schuster Asia Pte. Ltd., Singapore
Editora Prentice-Hall do Brazil, Ltda., Rio de Janeiro'''

У меня на перепечатку ушло 5 минут ровно

In [152]:
def colored_diff(s_was, s_become):
    import difflib
    from colorama import Fore, Back, Style
    result = []
    for item in difflib.Differ().compare(s_was, s_become):
        typ, _, ch = item
        if typ == ' ':
            result.append(ch)
        elif typ == '-':
            result.append(Fore.YELLOW + Back.RED + ch + Style.RESET_ALL + Fore.BLACK)
        elif typ == '+':
            result.append(Fore.YELLOW + Back.GREEN + ch + Style.RESET_ALL + Fore.BLACK)
    return ''.join(result)
In [153]:
print colored_diff(ocred, mine)
Acquisitions editor: Paul Becker

Editorial assistant: Noreen Regina

Cover design director: Eloise Starkweather
Cover designer: Lundgren Graphics
Manufacturing buyer: Mary E. McCartney

©1994 by P.J. Plauger

Published by PTR Prentice-Hall, Inc.
A Simon & Schuster Company

Englewood Cliffs, New Jersey 07632

 

All rights reserved. No part of this book may be reproduced,
in any form or by any means, without permission in writing
of the author.

The publisher offers discounts on this book when ordered in

bulk quantities. For more information, contact Corporate Sales Department,
PTR Prentice Hall, 113 Sylvan Avenue, Englewood Cliffs, NJ 07632.
Phone: 201-592-2863; FAX: 201-592-2249.

Printed in the United States of America
10 9 8 7 6 5 4 3 2 1

ISBN 0- O-13-328113-2

Prentice-Hall International (UK) Limited, London
Prentice-Hall of Australia, Pty. Limited, Sydney
Prentice-Hall Canada Inc., Toronto

Prentice-Hall Hispanoamericana, S.A., Mexico
Prentice-Hall of India Private Limited, New Delhi
Prentice-Hall of Japan, Inc., Tokyo

Simon & Schuster Asia Pte. Ltd., Singapore

Editora Prentice-Hall do Brazil, Ltda., Rio de Janeiro

Системы контроля версий

Значительное количество информационных артефактов, особенно разрабатываемых коллективно, хранится в системах контроля версий, таких, как git. Для автоматизации доступа к ним существует библиотека GitPython.

todo Читать блоб в любом месте истории, дифф, git blame, реп посложнее? доступ по пути в tree?

pip install GitPython
In [9]:
import git
In [10]:
repo = git.Repo('c:\\Temp\\python-finediff-copy-for-gitpython')
In [11]:
print repo.is_dirty()
print repo.untracked_files
False
[]
In [12]:
repo.refs
Out[12]:
[<git.Head "refs/heads/master">,
 <git.RemoteReference "refs/remotes/origin/master">]
In [13]:
repo.tags
Out[13]:
[]
In [14]:
repo.heads
Out[14]:
[<git.Head "refs/heads/master">]
In [15]:
repo.heads.master.name
Out[15]:
'master'

Перечисление коммитов

In [54]:
for commit in repo.iter_commits(max_count=10):
    print commit, commit.author.name, commit.authored_datetime
    print commit.message.strip()
    if len(commit.parents):
        print commit.parents[0].diff(commit)
    print
9596490bbb905d194eff4a34e2920a77dab0acea do 2018-05-24 14:53:46+03:00
"Installation" in README.md
[<git.diff.Diff object at 0x00000000043AF168>]

abf3e7bcbd985cd1c00f2b98fac94acdec21ce8e do 2018-05-24 14:47:28+03:00
initial commit

In [16]:
last_master_commit = repo.refs['master'].commit
last_master_commit
Out[16]:
<git.Commit "9596490bbb905d194eff4a34e2920a77dab0acea">

Свойства коммита

In [31]:
print last_master_commit.hexsha
print last_master_commit.author.name, last_master_commit.author.email
print last_master_commit.authored_datetime
print
print last_master_commit.parents
print
for diff in last_master_commit.parents[0].diff(last_master_commit, create_patch=True):
    print diff.a_path, diff.b_path
    print '%d bytes -> %d bytes' % (len(diff.a_blob.data_stream.read()), len(diff.b_blob.data_stream.read()))
    print
    print diff.diff
9596490bbb905d194eff4a34e2920a77dab0acea
do sharp-c@yandex.ru
2018-05-24 14:53:46+03:00

(<git.Commit "abf3e7bcbd985cd1c00f2b98fac94acdec21ce8e">,)

README.md README.md
251 bytes -> 354 bytes

@@ -5,4 +5,10 @@ This is Python port of https://github.com/gorhill/PHP-FineDiff, library for stri
 import finediff
 finediff.FineDiff('abcdef', 'badefo').renderDiffToHTML()
 ```
-`'<del>a</del>b<del>c</del><ins>a</ins>def<ins>o</ins>'`
\ No newline at end of file
+`'<del>a</del>b<del>c</del><ins>a</ins>def<ins>o</ins>'`
+
+### Installation
+
+```bash
+pip install https://github.com/sharpden/python-finediff/tarball/master
+```

Доступ к дереву файлов конкретного коммита

In [60]:
last_master_commit.tree
Out[60]:
<git.Tree "ba6f2a2c6056cc71a4bebcab3686dec82ba2ca2d">
In [40]:
for blob in last_master_commit.tree.traverse():
    print blob.path, blob.size
    print repr(blob.data_stream.read()[:40])
README.md 354
'# python-finediff\nThis is Python port of'
finediff.py 16327
'# -*- coding: utf-8 -*-\n# Based on http:'
setup.py 887
'import sys\nimport os\nfrom setuptools imp'