我有一个字符串,基本上包含一堆JSON格式的文本,我最终希望以"漂亮的打印"格式导出到Excel,并使用适当的嵌套缩进等.
为了便于阅读,必须保留密钥/值的原始顺序.我的思维过程是为了实现我想要的
a)使用类似eval之类的东西将字符串转换为字典,以及b)使用集合库中的OrderedDict来保持订单的完整性.
但是我没有得到预期的结果:
In [21]: json_string = str({"id":"0","last_modified":"undefined"})
In [22]: OrderedDict(eval(json_string))
Out[23]: OrderedDict([('last_modified', 'undefined'), ('id', '0')])
Run Code Online (Sandbox Code Playgroud)
我还没有完全弄清楚我将如何以漂亮的打印格式将输出写入excel,但我希望这是相对容易的部分!
以下Python函数导致附件在名称为"noname"时应为"text_file.txt".正如您所看到的,我尝试了两种不同的MIMEBase和MIMEApplication方法.我也试过MIMEMultipart('替代')无济于事.
def send_email(from_addr, to_addr_list,
subject, html_body,plain_text_body,
login,
password,
smtpserver='smtp.gmail.com:587',
cc_addr_list=None,
attachment=None,
from_name=None):
message=MIMEMultipart()
plain=MIMEText(plain_text_body,'plain')
html=MIMEText(html_body,'html')
message.add_header('from',from_name)
message.add_header('to',','.join(to_addr_list))
message.add_header('subject',subject)
if attachment!=None:
#attach_file=MIMEBase('application',"octet-stream")
#attach_file.set_payload(open(attachment,"rb").read())
#Encoders.encode_base64(attach_file)
#f.close()
attach_file=MIMEApplication(open(attachment,"rb").read())
message.add_header('Content-Disposition','attachment; filename="%s"' % attachment)
message.attach(attach_file)
message.attach(plain)
message.attach(html)
server = smtplib.SMTP(smtpserver)
server.starttls()
server.login(login,password)
server.sendmail(from_addr, to_addr_list, message.as_string())
server.quit()
Run Code Online (Sandbox Code Playgroud)
我是如何调用函数的:
send_email(
from_addr=from_email,
to_addr_list=["some_address@gmail.com"],
subject=subject,
html_body=html,
plain_text_body=plain,
login=login,
password=password,
from_name=display_name,
attachment="text_file.txt"
)
Run Code Online (Sandbox Code Playgroud) 细节:
Python 3.2(32位安装)Windows 7 64位
导致错误的代码:
from sklearn import svm
Run Code Online (Sandbox Code Playgroud)
错误:
Traceback (most recent call last):
File "C:\Users\chrismv48\workspace\Python Datamining\Biological_Response.py", line 1, in <module>
from sklearn import svm
File "C:\Python32\lib\site-packages\sklearn\svm\__init__.py", line 13, in <module>
from .classes import SVC, NuSVC, SVR, NuSVR, OneClassSVM, LinearSVC
File "C:\Python32\lib\site-packages\sklearn\svm\classes.py", line 3, in <module>
from .base import BaseLibLinear, BaseLibSVM
File "C:\Python32\lib\site-packages\sklearn\svm\base.py", line 5, in <module>
from . import libsvm, liblinear
ImportError: DLL load failed: The specified module could not be found.
Run Code Online (Sandbox Code Playgroud)
我已经尝试了其他缺失DLL线程中提出的一些解决方案,但没有成功......
我有一个包含2列的pandas数据框(下面的代码段).我正在尝试使用City列来推断Borough(您会注意到一些需要替换的Unspecified值).要做到这一点,我试图为每个城市显示最高的自治市镇并输出到一个字典,其中关键是城市,价值将是该城市最高的自治市镇.
City Borough
Brooklyn Brooklyn
Astoria Queens
Astoria Unspecified
Ridgewood Unspecified
Ridgewood Queens
Run Code Online (Sandbox Code Playgroud)
因此,如果发现里奇伍德与皇后队100次配对,布鲁克林4次与曼哈顿1次配对,那么这对将是里奇伍德:皇后区.
到目前为止,我已经尝试过这段代码:
specified = data[['Borough','City']][data['Borough']!= 'Unspecified']
paired = specified.Borough.groupby(specified.City).max()
Run Code Online (Sandbox Code Playgroud)
乍一看,这似乎是正确的输出,但仔细检查后,输出完全不正确.有任何想法吗?
编辑:
试过下面的建议:paired = specified.groupby('City').agg(lambda x:stats.mode(x ['Borough'])[0])
我注意到一些自治市镇被截断,如下图所示:
paired.Borough.value_counts()
#[Out]# QUEENS 58
#[Out]# MANHATTAN 7
#[Out]# STATEN ISLAND 4
#[Out]# BRONX 4
#[Out]# BROOKLYN 3
#[Out]# MANHATTA 2
#[Out]# STATE 1
#[Out]# QUEEN 1
#[Out]# MANHA 1
#[Out]# BROOK 1
Run Code Online (Sandbox Code Playgroud)
当然我可以手动替换截断的单词,但我很想知道原因是什么?
PS - 这是DF指定的FYI的输出:
specified
#[Out]# <class 'pandas.core.frame.DataFrame'>
#[Out]# Int64Index: 719644 entries, 1 to 396225
#[Out]# Data columns: …Run Code Online (Sandbox Code Playgroud) (Python 2.7,Pandas 0.9)
这似乎是一件简单的事情,但我无法弄清楚如何使用Pandas计算数据框中两个日期列之间的差异.此数据帧已经有一个索引,因此不希望将任何列放入DateTimeIndex.
要从我使用的字符串转换每个日期列:
data.Date_Column = pd.to_datetime(data.Date_Column)
Run Code Online (Sandbox Code Playgroud)
从那里,为了获得两列之间的经过时间,我做:
data.Closed_Date - data.Created_Date
Run Code Online (Sandbox Code Playgroud)
返回错误:
TypeError: %d format: a number is required, not a numpy.timedelta64
Run Code Online (Sandbox Code Playgroud)
检查两列上的dtypes会产生datetime64 [ns],并且数组中的各个日期都是类型时间戳.
我错过了什么?
编辑:
这是一个示例,我可以创建单独的DateTimeIndex对象并完成我想要的,但是当我尝试在数据帧的上下文中执行它时,它会失败.
Created_Date = pd.DatetimeIndex(data['Created_Date'], copy=True)
Closed_Date = pd.DatetimeIndex(data['Closed_Date'], copy=True)
Closed_Date.day - Created_Date.day
[Out] array([ -3, -16, 5, ..., 0, 0, 0])
Run Code Online (Sandbox Code Playgroud)
现在相同但在数据帧中:
data.Created_Date = pd.DatetimeIndex(data['Created_Date'], copy=True)
data.Closed_Date = pd.DatetimeIndex(data.Closed_Date, copy=True)
data.Created_Date.day - data.Created_Date.day
AttributeError: 'Series' object has no attribute 'day'
Run Code Online (Sandbox Code Playgroud)
如果你想玩它,这里有一些数据:
data['Created Date'][0:10].to_dict()
{0: '1/1/2009 0:00',
1: '1/1/2009 0:00',
2: '1/1/2009 0:00',
3: …Run Code Online (Sandbox Code Playgroud) 鉴于下面的数组,我想comments通过使用的线程方式进行渲染parentId.
comments: [
{
id: 1,
parentId: null
},
{
id: 2,
parentId: 1
},
{
id: 3,
parentId: 1
},
{
id: 4,
parentId: 3
},
{
id: 5,
parentId: 4
}
]
Run Code Online (Sandbox Code Playgroud)
我认为使用下面的组件我可以通过评论进行递归,但输出并不是我所期望的(它似乎是<ul>为每个评论渲染一个新元素.)我有点新的反应和javascript,所以也许我没有正确实现递归,或者comments结构不同?
const Comment = (props) => (
<li>
{props.comment.id}
{props.comment.children.length > 0 ?
<Comments comments={props.comment.children}/>
: null }
</li>
);
const Comments = (props) => (
<ul>
{props.comments.map((comment) => {
comment.children = _.filter(props.comments, {'parentId': comment.id});
return <Comment key={comment.id} …Run Code Online (Sandbox Code Playgroud) 我有Pandas系列,我们称之为approved_fields,我想用它来过滤df:
approved_field(['Field1','Field2','Field3')]
df
Field
0 Field1
1 Field4
2 Field2
3 Field5
4 Field2
Run Code Online (Sandbox Code Playgroud)
应用approved_field过滤器后,生成的df应如下所示:
Field
0 Field1
1 Field2
2 Field2
Run Code Online (Sandbox Code Playgroud)
谢谢!
我目前使用的方法get_close_matches从法difflib迭代通过15000个字符串列表以获得对大约15000串的另一个列表最接近的匹配:
a=['blah','pie','apple'...]
b=['jimbo','zomg','pie'...]
for value in a:
difflib.get_close_matches(value,b,n=1,cutoff=.85)
Run Code Online (Sandbox Code Playgroud)
每个值需要 0.58 秒,这意味着完成循环需要 8,714 秒或 145 分钟。是否有其他库/方法可能更快或提高此方法的速度?我已经尝试将两个数组转换为小写,但它只会导致速度略有增加。
python performance fuzzy-comparison difflib levenshtein-distance
我在端口9150上的远程服务器(Ubuntu)上运行Tor,控制端口在9151上.我已确认两者都是通过netstat -ant运行的.
这是我的代码,它引出了SOCKS5Error: 0x01: General SOCKS server failure错误.
import socks
import socket
socks.set_default_proxy(socks.SOCKS5, server_ip, 9150)
socket.socket = socks.socksocket
Run Code Online (Sandbox Code Playgroud)
我可以从任何库发出请求,并成功获得带有转发地址的响应.
但是以下是导致错误的原因:
from stem import Signal
from stem.control import Controller
with Controller.from_port(port = 9151) as controller:
controller.authenticate(password)
controller.signal(Signal.NEWNYM)
Run Code Online (Sandbox Code Playgroud)
如果我在没有使用socks(第一个代码片段)设置代理的情况下运行上述操作,我可以毫无问题地发出信号.
我有一个名单列表,我用它来提取目标字符串列表.例如:
names = ['Chris', 'Jack', 'Kim']
target = ['Chris Smith', 'I hijacked this thread', 'Kim','Christmas is here', 'CHRIS']
output = ['Chris Smith', 'Kim', 'CHRIS']
Run Code Online (Sandbox Code Playgroud)
所以到目前为止的规则是:
为此,另一个SO用户在此主题中建议了此代码:
[targ for targ in target_list if any(re.search(r'\b{}\b'.format(name), targ, re.I) for name in first_names)]
Run Code Online (Sandbox Code Playgroud)
到目前为止,这非常准确,但非常缓慢,因为名称列表长度约为5,000,目标列表长度为20-100行,一些字符串长度不超过30个字符.
有关如何提高性能的任何建议吗?
解决方案:两个基于正则表达式的解决方案都遇到了OverflowErrors,所以遗憾的是我无法测试它们.有效的解决方案(来自@ mglison的回答)是:
new_names = set(name.lower() for name in names)
[ t for t in target if any(map(new_names.__contains__,t.lower().split())) ]
Run Code Online (Sandbox Code Playgroud)
这使得性能从15秒大幅提升到1秒以下.
python ×9
pandas ×3
python-2.7 ×3
dictionary ×1
difflib ×1
importerror ×1
javascript ×1
list ×1
performance ×1
proxy ×1
python-3.x ×1
reactjs ×1
recursion ×1
regex ×1
scikit-learn ×1
smtplib ×1
socks ×1
tor ×1
web-scraping ×1