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, похожий на литералы в JavaScript.
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}]
Устарел, но еще встречается (например, в формате fb2) XML. Для работы с ним подходит встроенная библиотека lxml
. Одним из удобных способов искать что-нибудь в XML (как во всем документе, так и в отдельном узле) являются селекторы XPath.
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>Сергей</first-name> <last-name>Другаль</last-name> </author>
for info in doc.findall('title-info'):
for genre in info.findall('genre'):
print genre.text
child_sf
parser = etree.XMLParser(recover=True)
tree = etree.fromstring('<root><a></a><b></b></rot>', parser)
parser.error_log
<string>:1:29:FATAL:PARSER:ERR_TAG_NAME_MISMATCH: Opening and ending tag mismatch: root line 1 and rot
Библиотека lxml
содержит и менее требовательный к памяти на больших XML SAX-парсер, генерирующий эвенты в процессе разбора.
import lxml
list(lxml.etree.iterparse(BytesIO(xml)))
[('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
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')]))]))]) Другаль
Впрочем, использовать ее следует с осторожностью
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 похож на XML, с которым они имеют общего предшественника, так что для парсинга HTML можно использовать ту же библиотеку lxml
. Оттуда же пришли селекторы CSS, иногда позволяющие записать выборку короче.
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'
Почти все 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
import pickle
from collections import OrderedDict
from numpy import nan
data = OrderedDict([((1,2,3), {'a': {1, 2, 3}, 'b': nan, 'c': []})])
serialized = pickle.dumps(data)
serialized
"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."
pickle.loads(serialized)
OrderedDict([((1, 2, 3), {'a': {1, 2, 3}, 'b': nan, 'c': []})])
С просмотром и анализом файла, сгенерированного pickle
, может помочь встроенная библиотека pickletools
import pickletools
print len(serialized), len(pickletools.optimize(serialized))
158 108
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
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
pickle.loads(pickle_bomb)
BOOM!
Несколько более читабельной альтернативой может послужить библиотека jsonpickle
.
pip install jsonpickle
import jsonpickle
dumped = jsonpickle.dumps({1, 2.0, 2**100, None})
dumped
'{"py/set": [1267650600228229401496703205376, 1, 2.0, null]}'
jsonpickle.loads(dumped)
{None, 1, 2.0, 1267650600228229401496703205376L}
Очень похож на JSON, но удобнее для хранения бинарных данных формат Bencode, используемый, например, в файлах *.torrent
. Для его парсинга используется одноименная библиотека bencode
.
pip install bencode
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" }
Если структурированные данные хочется задавать ручками в текстовом редакторе или диффать, ни JSON, ни XML не лучший выбор. Удобнее всего для этих целей TOML, язык разметки, похожий на формат *.ini
файлов.
pip install toml
todo или лучше pytoml?
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
toml.loads('''
[section]
[[section.value]]
a = "A"
b = "B"
[[section.value]]
a = "AA"
b = "BB"
''')
{u'section': {u'value': [{u'a': u'A', u'b': u'B'}, {u'a': u'AA', u'b': u'BB'}]}}
Встроенная библиотека csv
позволяет построчно читать в списки (и писать из) строки CSV-файла.
from io import BytesIO
import csv
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']
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
import pandas
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')
a | b | |
---|---|---|
first | 1 | 2 |
second | 3 | 4 |
third | 2 | 5 |
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
df.describe()
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 |
df.reset_index()
index | a | b | |
---|---|---|---|
0 | first | 1 | 2 |
1 | second | 3 | 4 |
2 | third | 2 | 5 |
df.rank()
a | b | |
---|---|---|
first | 1.0 | 1.0 |
second | 3.0 | 2.0 |
third | 2.0 | 3.0 |
print df.iloc[0,1]
print df.loc['first','b']
2 2
Объект pandas.DataFrame
похож по API на словарь строка → numpy.array
import math
(df['PID'] * 2).apply(math.sqrt).astype(int)[:5].map({69: 'a'})
0 a 1 a 2 a 3 a 4 a Name: PID, dtype: object
df['New Column'] = df['Operation'].apply(lambda s:s[:-1])
df.head()
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
df.columns
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')
df.drop('New Column', 1).head()
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)
df.sort_index(ascending=True).cumsum()
a | b | |
---|---|---|
first | 1 | 2 |
second | 4 | 6 |
third | 6 | 11 |
df.sort_index(ascending=False)
a | b | |
---|---|---|
third | 2 | 5 |
second | 3 | 4 |
first | 1 | 2 |
df.sort_values('a', ascending=True)
a | b | |
---|---|---|
first | 1 | 2 |
third | 2 | 5 |
second | 3 | 4 |
import pandas
Объект pandas.DataFrame
можно создать из массива словарей, из 2D массива, из словаря массивов,
pandas.DataFrame([{'a': 1, 'b': 2}, {'a': 3, 'b': 4}])
a | b | |
---|---|---|
0 | 1 | 2 |
1 | 3 | 4 |
pandas.DataFrame([[1, 2], [3, 4]], columns=['a', 'b'])
a | b | |
---|---|---|
0 | 1 | 2 |
1 | 3 | 4 |
pandas.DataFrame({'a': [1, 3], 'b': [2, 4]})
a | b | |
---|---|---|
0 | 1 | 2 |
1 | 3 | 4 |
из базы данных SQL, из файла CSV.
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()
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
df = pandas.read_csv('C:\\Users\\User\\Desktop\\Logfile.CSV')
df.head()
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... |
df['Process Name'].unique()
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)
df['Process Name'].value_counts()
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
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)
group = df[mask][['PID', 'Process Name', 'Operation', 'Duration']].groupby(['Process Name', 'PID'])
group
<pandas.core.groupby.DataFrameGroupBy object at 0x0000000019122550>
group.count().index
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'])
group.size().tolist()
[86L, 144L, 6L, 2357L, 66L, 1270L]
group.size().to_frame('Size').reset_index()
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 |
group.size().to_frame('Size').reset_index().nlargest(3, 'Size')
Process Name | PID | Size | |
---|---|---|---|
3 | chrome.exe | 4184 | 2357 |
5 | python.exe | 7120 | 1270 |
1 | Explorer.EXE | 2508 | 144 |
Аналогично .nsmallest
def fi(g):
return len(g) < 100
group.agg({'Duration': ['min', 'mean', 'max']}).T
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 |
group.count().sort_values('Operation', ascending=False)
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 |
group.sum()
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 Уникальные строки сразу с несколькими колонками?
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)
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
report = df[filtr].groupby([extract_filename, 'Result']).size().unstack(fill_value=0)
report[report['SUCCESS'] == 0].sort_values('NAME NOT FOUND', ascending=False)
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)
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
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
pandas.read_excel('file.xlsx')
pandas.read_excel(pandas.ExcelFile('file.xlsx'), 'Sheet1')
df.to_excel('file.xlsx', sheet_name='Sheet 1')
One-hot кодирование данных
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
numpy.random.seed(0)
df = pandas.DataFrame(numpy.random.randint(0, 7, size=(8,)), columns=['cls'])
df
cls | |
---|---|
0 | 4 |
1 | 5 |
2 | 0 |
3 | 3 |
4 | 3 |
5 | 3 |
6 | 1 |
7 | 3 |
pandas.get_dummies(df['cls'], prefix='cls')
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
может обрезать слишком длинные строки в ячейке таблицы. Изменить это поведение:
pandas.set_option('display.max_colwidth', -1)
todo Пример
Иногда выборку данных над таблицей pandas быстрее записать в SQL, чем в вызовах методов pandas
. На этот случай есть библиотека pandasql
(входит в Anaconda).
from pandasql import sqldf
df = pandas.read_csv("files/heroes++.csv")
df.head()
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 |
df[df.roles.map(lambda x: 'Disabler' in x) & (df.attack == 'melee') & (df.type == 'intelligence')][['localized_name', 'type']]
localized_name | type | |
---|---|---|
53 | Dark Seer | intelligence |
82 | Ogre Magi | intelligence |
sqldf("SELECT localized_name, type FROM df WHERE attack='melee' AND roles LIKE '%Disabler%' AND type='intelligence'", globals())
localized_name | type | |
---|---|---|
0 | Dark Seer | intelligence |
1 | Ogre Magi | intelligence |
Простейшей базой данных, поддерживающей SQL, является встраиваемая БД SQLite, использующая один файл для хранения реляционных таблиц. Ее можно использовать посредством встроенной библиотеки sqlite3
. При этом никакого дополнительного ПО ставить не надо.
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.
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 раз
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
import sqlparse
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
%load_ext sql
%sql mysql+pymysql://root:toor@localhost/bookwarrior?charset=utf8
%sql select Author, Title, Filesize from updated where Filesize > 1500000000 order by Filesize desc
* mysql+pymysql://root:***@localhost/bookwarrior?charset=utf8 11 rows affected.
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
import SPARQLWrapper
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()
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 нет данных о численности населения.
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 | Буэнос-Айрес | 2890151 | 6.66% |
Боливия | 11410651 | Сукре (город) | 300000 | 2.63% |
Бразилия | 206440850 | Бразилиа | 2556149 | 1.24% |
Венесуэла | Каракас | 3273863 | nan% | |
Гайана | 735554 | Джорджтаун | 118363 | 16.09% |
Колумбия | 48786100 | Богота | 7878783 | 16.15% |
Парагвай | 6783272 | Асунсьон | 525294 | 7.74% |
Перу | 31151643 | Лима | 8852000 | 28.42% |
Суринам | 573311 | Парамарибо | 240924 | 42.02% |
Уругвай | 3427000 | Монтевидео | 1305082 | 38.08% |
Чили | 18006407 | Сантьяго | 6158080 | 34.20% |
Эквадор | 16144000 | Кито | 2671191 | 16.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 МБ.
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 или из файлов.
import rdflib
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
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
.
rdflib.URIRef('http://ya.ru/rdf').n3()
u'<http://ya.ru/rdf>'
rdflib.Literal(2 ** 100).n3()
u'"1267650600228229401496703205376"^^<http://www.w3.org/2001/XMLSchema#integer>'
rdflib.Literal('hello\0"Привет', lang='ru').n3()
u'"hello\x00\\"\u041f\u0440\u0438\u0432\u0435\u0442"@ru'
import datetime
rdflib.Literal(datetime.datetime.now()).n3()
u'"2018-05-18T13:32:41.819000"^^<http://www.w3.org/2001/XMLSchema#dateTime>'
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
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()
import os
%%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
bg.query('SELECT (COUNT(?s) AS ?c) WHERE { ?s ?p ?o . }')
[{u'c': 26647}]
os.path.getsize("C:\\Temp\\blazegraph\\blazegraph.jnl")
1184866800L
Вставка 1000 инсертами 26647 триплов 249 сек, вес БД 1.18 ГБ.
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)
len(triples)
1000
%%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:
bg.query('SELECT (COUNT(?s) AS ?c) WHERE { ?s ?p ?o . }')
[{u'c': 2043}]
Вставка инсертом на каждый трипл ? триплов ? сек
Разосрался до 2 ГБ, почти ничего не вставив.
todo Некомплиментарненько
%%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
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
%%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
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
%%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
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
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)))
len(g)
26368
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
}
PyPDF2 (1.26.0)
reportlab -- писать в PDF, векторная графика и все такое
https://github.com/pmaupin/pdfrw pure Python library that reads and writes PDFs
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')
xlrd
PyUNO
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 можно использовать библиотеку 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\
import djvu
import djvu.decode
import numpy
%pylab inline
Populating the interactive namespace from numpy and matplotlib
filename = 'D:\\(library)\\(__Unsorted)\\P. J. Plauger Programming on purpose III essays on software technology 1994.djvu'
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)
img3d = zeros((img.shape[0], img.shape[1], 3), dtype=uint8)
img3d[:,:,0] = img >> 16
img3d[:,:,1] = (img >> 8) & 0xFF
img3d[:,:,2] = img & 0xFF
figure(figsize=(16, 20))
xticks([]); yticks([])
imshow(img3d, interpolation='bilinear');
Распознать скан может помочь библиотека pyocr
, являющаяся враппером над open-source OCR Tesseract от Google.
скачать и поставить https://github.com/tesseract-ocr/tesseract/wiki/Downloads#binaries-for-windows
указать инсталлеру скачать rus training
добавить в PATH
pip install pyocr
import pyocr
for tool in pyocr.get_available_tools():
print tool.get_name(), tool.get_available_languages()
Tesseract (sh) [u'eng', u'osd', u'rus']
from PIL import Image
im = Image.fromarray(img3d)
%%time
ocred = tool.image_to_string(im)
Wall time: 10.3 s
ocred
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'
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 минут ровно
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)
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
import git
repo = git.Repo('c:\\Temp\\python-finediff-copy-for-gitpython')
print repo.is_dirty()
print repo.untracked_files
False []
repo.refs
[<git.Head "refs/heads/master">, <git.RemoteReference "refs/remotes/origin/master">]
repo.tags
[]
repo.heads
[<git.Head "refs/heads/master">]
repo.heads.master.name
'master'
Перечисление коммитов
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
last_master_commit = repo.refs['master'].commit
last_master_commit
<git.Commit "9596490bbb905d194eff4a34e2920a77dab0acea">
Свойства коммита
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 +```
Доступ к дереву файлов конкретного коммита
last_master_commit.tree
<git.Tree "ba6f2a2c6056cc71a4bebcab3686dec82ba2ca2d">
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'