小编Chr*_*ong的帖子

将字符串转换为有序字典?

我有一个字符串,基本上包含一堆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 dictionary python-2.7

5
推荐指数
2
解决办法
4624
查看次数

收到的电子邮件附件为'noname'

以下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 smtplib python-2.7

5
推荐指数
1
解决办法
3970
查看次数

导入错误:尝试导入Python模块时,Windows 7上缺少DLL

细节:

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线程中提出的一些解决方案,但没有成功......

python importerror python-3.x scikit-learn

4
推荐指数
1
解决办法
7225
查看次数

根据最高发生值组合Pandas数据帧

我有一个包含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 pandas

4
推荐指数
1
解决办法
1720
查看次数

Pandas中日期序列(不是索引)的算术

(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)

python pandas

4
推荐指数
1
解决办法
5714
查看次数

在React中渲染嵌套/线程注释

鉴于下面的数组,我想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)

javascript recursion reactjs

4
推荐指数
1
解决办法
2174
查看次数

使用另一个系列过滤Pandas数据帧

我有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)

谢谢!

python python-2.7 pandas

3
推荐指数
1
解决办法
3972
查看次数

更好的模糊匹配性能?

我目前使用的方法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

3
推荐指数
2
解决办法
5667
查看次数

使用词干切换标识时,常规SOCKS服务器故障

我在端口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(第一个代码片段)设置代理的情况下运行上述操作,我可以毫无问题地发出信号.

python proxy tor socks web-scraping

3
推荐指数
1
解决办法
7674
查看次数

使用正则表达式循环的更有效方法是什么?

我有一个名单列表,我用它来提取目标字符串列表.例如:

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 regex list

0
推荐指数
1
解决办法
129
查看次数