我最近决定跳入 Python 池的最深处并开始将我的一些 R 代码转换为 Python 并且我被困在对我来说非常重要的事情上。在我的工作中,我花费了大量时间来解析文本数据,众所周知,文本数据非常非结构化。因此,我开始依赖正则表达式的环视功能,而 R 的环视功能非常强大。例如,如果我正在解析一个 PDF,当我对文件进行 OCR 时,它可能会在字母之间引入一些空格,我会得到我想要的值,如下所示:
oAcctNum <- str_extract(textBlock[indexVal], "(?<=ORIG\\s?:\\s?/\\s?)[A-Z0-9]+")
Run Code Online (Sandbox Code Playgroud)
在 Python 中,这是不可能的,因为使用?使后视成为可变宽度表达式而不是固定宽度。这个功能对我来说非常重要,它阻止了我想要使用 Python,但我不想放弃这种语言,我想知道 Pythonista 解决这个问题的方法。我是否必须在提取文本之前预处理字符串?像这样的东西:
oAcctNum = re.sub(r"(?<=\b\w)\s(?=\w\b)", "")
oAcctNum = re.search(r"(?<=ORIG:/)([A-Z0-9])", textBlock[indexVal]).group(1)
Run Code Online (Sandbox Code Playgroud)
有没有更有效的方法来做到这一点?因为虽然这个例子是微不足道的,但这个问题以非常复杂的方式出现在我处理的数据中,我不想对我分析的每一行文本进行这种预处理。
最后,如果这不是问这个问题的正确地方,我深表歉意;我不知道还有什么地方可以张贴。提前致谢。
我有110个PDF,我正在尝试从中提取图像.提取图像后,我想删除任何重复项并删除小于4KB的图像.我这样做的代码如下:
def extract_images_from_file(pdf_file):
file_name = os.path.splitext(os.path.basename(pdf_file))[0]
call(["pdfimages", "-png", pdf_file, file_name])
os.remove(pdf_file)
def dedup_images():
os.mkdir("unique_images")
md5_library = []
images = glob("*.png")
print "Deleting images smaller than 4KB and generating the MD5 hash values for all other images..."
for image in images:
if os.path.getsize(image) <= 4000:
os.remove(image)
else:
m = md5.new()
image_data = list(Image.open(image).getdata())
image_string = "".join(["".join([str(tpl[0]), str(tpl[1]), str(tpl[2])]) for tpl in image_data])
m.update(image_string)
md5_library.append([image, m.digest()])
headers = ['image_file', 'md5']
dat = pd.DataFrame(md5_library, columns=headers).sort(['md5'])
dat.drop_duplicates(subset="md5", inplace=True)
print "Extracting the unique images."
unique_images …Run Code Online (Sandbox Code Playgroud) 我有一个使用该zip函数创建的元组列表.zip带来的是四个列表一起:narrative,subject,activity,和filer,其中的每一个仅仅是一个0和1的列表.假设这四个列表看起来像这样:
narrative = [0, 0, 0, 0]
subject = [1, 1, 0, 1]
activity = [0, 0, 0, 1]
filer = [0, 1, 1, 0]
Run Code Online (Sandbox Code Playgroud)
现在,我正在将zip它们放在一起以获取一个布尔值列表,指示它们中是否有任何一个True.
ny_nexus = [True if sum(x) > 0 else False for x in zip(narrative, subject, activity, filer)]
我现在遇到的问题是获得第二个元组列表,如果在迭代期间它具有1,则返回变量的名称.我想它看起来像这样:
variables = ("narrative", "subject", "activity", "filer")
reason = [", ".join([some code to filter a tuple]) for x in zip(narrative, subject, activity, …Run Code Online (Sandbox Code Playgroud) 假设我有一个看起来像这样的文本文件:
Item,Date,Time,Location
1,01/01/2016,13:41,[45.2344:-78.25453]
2,01/03/2016,19:11,[43.3423:-79.23423,41.2342:-81242]
3,01/10/2016,01:27,[51.2344:-86.24432]
Run Code Online (Sandbox Code Playgroud)
我希望能够做的是读取pandas.read_csv,但第二行将抛出错误.这是我目前使用的代码:
import pandas as pd
df = pd.read_csv("path/to/file.txt", sep=",", dtype=str)
Run Code Online (Sandbox Code Playgroud)
我试图设置quotechar为"[",但显然只是吃掉线直到下一个打开括号并添加一个右括号会导致"找到长度为2的字符串"错误.任何见解将不胜感激.谢谢!
提供了三种主要解决方案:1)为数据框提供大量名称,以允许读入所有数据,然后对数据进行后处理,2)在方括号中查找值并在其周围加上引号,或者3)用分号替换前n个逗号.
总的来说,我认为选项3通常不是一个可行的解决方案(虽然对我的数据来说很好),因为a)如果我在一个包含逗号的列中引用了值,b)如果我的方括号列是不是最后一栏?这留下了解决方案1和2.我认为解决方案2更具可读性,但解决方案1更有效,仅运行1.38秒,而解决方案2则运行3.02秒.测试在包含18列和超过208,000行的文本文件上运行.
我正在工作的Windows 7计算机,并希望使用libpostal包.不幸的是,它显然不适用于Windows,所以我试图通过Cygwin配置它,我很接近.最后一步是从Google 安装snappy.再次,在Windows上不可用...
我的假设(基于什么都没有)是我可以下载tarball并从源代码构建它,对吧?我试过了,我觉得它有用吗?但是)我不知道如何分辨,和b)如果它这样做,我不知道如何告诉./configure中libpostal找到它.
为了从源代码构建它,我下载了tarball并将其保存在Cygwin读取为我家的文件夹中,即C:\cygwin64\home\brittenb\.从那里,我跑了bash autogen.sh,创造了./configure我需要的东西.所以我跑了那个,虽然对支票的一些反应是没有的,但似乎运行正常.然后我跑make和make install.似乎没有什么不合适的地方,所以我的假设是它做了应该做的事情.我不知道从哪里开始.
这是ls我运行一切之后的输出:
aclocal.m4 snappy.cc
AUTHORS snappy.h
autogen.sh snappy.lo
autom4te.cache snappy.o
ChangeLog snappy.pc
compile snappy.pc.in
config.guess snappy_unittest.cc
config.h snappy_unittest.exe
config.h.in snappy_unittest-snappy_unittest.o
config.log snappy_unittest-snappy-test.o
config.status snappy-c.cc
config.sub snappy-c.h
configure snappy-c.lo
configure.ac snappy-c.o
COPYING snappy-internal.h
depcomp snappy-sinksource.cc
format_description.txt snappy-sinksource.h
framing_format.txt snappy-sinksource.lo
INSTALL snappy-sinksource.o
install-sh snappy-stubs-internal.cc
libsnappy.la snappy-stubs-internal.h
libtool snappy-stubs-internal.lo
ltmain.sh snappy-stubs-internal.o
m4 snappy-stubs-public.h
Makefile snappy-stubs-public.h.in
Makefile.am snappy-test.cc …Run Code Online (Sandbox Code Playgroud) 我正在尝试从网站下载和保存讲座视频。虽然我已成功下载文件,但它们无法在我的媒体播放器中播放。这是我正在使用的代码:
from bs4 import BeautifulSoup
import re
import urllib2
snippet = open('Python/SNA Page Source Revised.txt', 'r')
soup = BeautifulSoup(snippet)
links = [link.get('href') for link in soup.find_all('a')]
videos = []
for link in links:
match = re.search('.*mp4.*', link)
if match:
videos.append(link)
vidNum = 1
for video in videos:
f = urllib2.urlopen(video)
with open('Data Analysis/Social Network Analysis/Video '+vidNum+'.mp4', 'wb') as code:
code.write(f.read())
vidNum += 1
Run Code Online (Sandbox Code Playgroud)
一切似乎都正常,但是当我尝试播放其中一个视频时,出现此错误:“Python (v2.7) 需要安装插件才能播放以下类型的媒体文件:text/html 解码器”此外,如果我手动从网站下载视频,文件大约为 22.8MB,但是当我使用我的脚本时,文件只有 7.8kB。
我下载文件的方式有问题吗?任何帮助将不胜感激。
另外:我在使用 Python v2.7 的 Ubuntu 12.04 LTS 操作系统上运行。
****编辑 …
关于如何从单词之间删除额外的空格,有很多答案,这是非常简单的.但是,我发现在单词中删除多余的空格要困难得多.作为一个可重现的例子,假设我有一个如下所示的数据向量:
x <- c("L L C", "P O BOX 123456", "NEW YORK")
我想做的是这样的事情:
y <- gsub("(\\w)(\\s)(\\w)(\\s)", "\\1\\3", x)
但这让我想到了这个:
[1] "LLC" "POBOX 123456" "NEW YORK"
几乎完美,但我真的希望第二个值说"PO BOX 123456".有没有比我正在做的更好的方法呢?
我正在尝试读取一个相当简单的csv文件,但readr在我尝试指定列类型时抛出错误.这是我的数据的一小部分:
text <- "Item,Date,Time,SeizureTime,ET,OriginatingNumber,TerminatingNumber,IMEI,IMSI,CT,Feature,DIALED,FORWARDED,TRANSLATED,ORIG_ORIG,MAKE,MODEL,TargetNumber
3,10/31/2012,7:53:00,0:15,1:43,(123)555-1216,(123)555-5662,,,MO,[],,11235552511,,,,,(123)555-5662
4,10/31/2011,9:04:00,0:25,0:00,(123)555-0214,(123)555-5662,,,MO,[],,11235552511,,,,,(123)555-5662
9,10/31/2014,9:08:00,0:11,2:13,(123)555-8555,(132)555-5662,,,MO,[],,11235552511,,,,,(123)555-5662
12,10/31/2011,9:27:00,0:07,0:10,(123)555-0214,(123)555-5662,,,MO,[],,11235552511,,,,,(123)555-5662
13,10/31/2015,9:35:00,0:27,0:00,(123)555-0214,(123)555-5662,,,MO,[],,11235552511,,,,,(123)555-5662
16,10/31/2011,10:09:00,0:10,14:13,(123)555-1216,(123)555-5662,,,MO,[],,11235552511,,,,,(123)555-5662"
dat <- read.table(text = text, sep = ",", header = TRUE)
Run Code Online (Sandbox Code Playgroud)
当我尝试使用实际的CSV读取时,read_csv("file.csv", col_types = rep("c", times = 18))我得到了标题中提到的错误.我已经看到了关于这个错误的几个SO问题,它们似乎都与后台发生的C++函数有关,但我不知道如何解决它.如果我剥离col_types参数,错误消失,但它不能正确解析数据.
我正在尝试将camelCase 变量名称转换为snake_case 并希望使用正则表达式来执行此操作。我认为一个简单的查找[a-z]([A-Z])和替换_$L$1会起作用,但它实际上是将“$L”放入变量名中。RStudio(使用 PERL 引擎进行正则表达式)中用小写字母替换捕获组的方法是什么?
我有一个pandas.Series可能看起来像这样的对象:
import pandas as pd
myVar = pd.Series(["VLADIVOSTOK 690090", "MAHE", NaN, NaN, "VLADIVOSTOK 690090", "2000-07-01 00:00:00"])
Run Code Online (Sandbox Code Playgroud)
myVar[5]datetime.datetime当数据通过Python读入时,被解析为对象pandas.我假设将此值转换为自纪元(36708)以来的天数并不困难.我刚接触Python,不知道该怎么做.提前致谢!