我的程序需要读取可能有1,2或3列的csv文件,并且需要相应地修改其行为.在迭代器运行之前,是否有一种简单的方法可以检查列数而不"消耗"一行?以下代码是我可以管理的最优雅的代码,但我更愿意在for循环开始之前运行检查:
import csv
f = 'testfile.csv'
d = '\t'
reader = csv.reader(f,delimiter=d)
for row in reader:
if reader.line_num == 1: fields = len(row)
if len(row) != fields:
raise CSVError("Number of fields should be %s: %s" % (fields,str(row)))
if fields == 1:
pass
elif fields == 2:
pass
elif fields == 3:
pass
else:
raise CSVError("Too many columns in input file.")
Run Code Online (Sandbox Code Playgroud)
编辑:我应该包含有关我的数据的更多信息.如果只有一个字段,则必须包含科学记数法的名称.如果有两个字段,则第一个字段必须包含名称,第二个字段必须包含链接代码.如果有三个字段,则附加字段包含一个标志,该标志指定名称当前是否有效.因此,如果任何行包含1,2或3列,则所有行必须具有相同的列.
我正在使用一个namedtuples列表.我想在每个已命名的元组创建后添加一个字段.我似乎只能将它作为一个属性引用(如namedtuple.attribute = 'foo'),但它不会添加到字段列表中.如果我不对字段列表做任何事情,我有什么理由不这样做吗?有没有更好的方法来添加字段?
>>> from collections import namedtuple
>>> result = namedtuple('Result',['x','y'])
>>> result.x = 5
>>> result.y = 6
>>> (result.x, result.y)
(5, 6)
>>> result.description = 'point'
>>> (result.x, result.y, result.description)
(5, 6, 'point')
>>> result._fields
('x', 'y')
Run Code Online (Sandbox Code Playgroud) 我已经定义了一个行生成器,d3.js如下所示:
var line = d3.svg.line()
.interpolate("monotone")
.x(function(d) {return x(d.date); })
.y(function(d) {return y0(d.visits); });
Run Code Online (Sandbox Code Playgroud)
使用以下格式从csv读取数据:
date,visits
12/08/12,1
13/08/12,0
14/08/12,0
15/08/12,33
16/08/12,28
Run Code Online (Sandbox Code Playgroud)
csv文件被加载到data并解析为:
data.forEach(function(d) {
d.date = d3.time.format("%d/%m/%y").parse(d.date);
d.visits = +d.visits;
});
Run Code Online (Sandbox Code Playgroud)
并添加到文档中:
svg.append("path")
.datum(data)
.attr("class", "line")
.attr("d", line)
Run Code Online (Sandbox Code Playgroud)
在我的脚本的其他地方,我需要弄清楚特定日期的y值.因此,例如,我可能希望得到日期所在的行的值15/08/12(相当于y0(33)).我怎样才能做到这一点?
如何告诉difflib.get_close_matches()忽略大小写?我有一个字典,其中包含一个包含大小写的定义格式.但是,测试字符串可能具有完全大小写或没有大小写,这些应该是等效的.但是,结果需要适当地大写,因此我不能使用修改后的字典.
import difflib
names = ['Acacia koa A.Gray var. latifolia (Benth.) H.St.John',
'Acacia koa A.Gray var. waianaeensis H.St.John',
'Acacia koaia Hillebr.',
'Acacia kochii W.Fitzg. ex Ewart & Jean White',
'Acacia kochii W.Fitzg.']
s = 'Acacia kochi W.Fitzg.'
# base case: proper capitalisation
print(difflib.get_close_matches(s,names,1,0.9))
# this should be equivalent from the perspective of my program
print(difflib.get_close_matches(s.upper(),names,1,0.9))
# this won't work because of the dictionary formatting
print(difflib.get_close_matches(s.upper().capitalize(),names,1,0.9))
Run Code Online (Sandbox Code Playgroud)
输出:
['Acacia kochii W.Fitzg.']
[]
[]
Run Code Online (Sandbox Code Playgroud)
工作代码:
根据Hugh Bothwell的回答,我修改了如下代码以获得一个有效的解决方案(当返回多个结果时,它也应该有效):
import difflib
names = ['Acacia koa …Run Code Online (Sandbox Code Playgroud) 我试图使用属性方法来设置类实例的状态,具有以下类定义:
class Result:
def __init__(self,x=None,y=None):
self.x = float(x)
self.y = float(y)
self._visible = False
self._status = "You can't see me"
@property
def visible(self):
return self._visible
@visible.setter
def visible(self,value):
if value == True:
if self.x is not None and self.y is not None:
self._visible = True
self._status = "You can see me!"
else:
self._visible = False
raise ValueError("Can't show marker without x and y coordinates.")
else:
self._visible = False
self._status = "You can't see me"
def currentStatus(self):
return self._status
Run Code Online (Sandbox Code Playgroud)
但是,从结果来看,虽然内部变量正在改变,但似乎没有执行setter方法:
>>> …Run Code Online (Sandbox Code Playgroud) 我在Visual Studio 2013中编写了一个简单的MS Word AddIn,我希望能够记录事件,最好是Windows事件查看器.如果我尝试为我的应用程序创建一个新的事件源,我似乎会遇到权限问题.我正在寻找最简单的方法来启用我的VSTO记录事件,这些事件不违反良好的编程指南.
我在MSDN文档中看到Office Solutions的事件记录:
您可以使用Windows中的事件查看器查看安装或卸载Office解决方案时Visual Studio Tools for Office运行时捕获的异常消息.您可以使用事件记录器中的这些消息来解决安装和部署问题.
使用VSTO 4.0源记录这些事件.我可以使用VSTO 4.0源来记录来自我自己的AddIn的错误,还是这被认为是不好的做法?
编辑:从Eugene Astafiev的回答和我在其他地方读到的内容看起来这将是一个糟糕的方法,因为VSTO 4.0源只应该处理AddIns的管理,而不是AddIns本身.其他问题的答案也建议不要使用"通用"来源.
作为替代方案,我可以包含一个简单的引导程序应用程序,它在安装过程中创建源代码,但我无法使用"属性">"在Visual Studio中发布"下的"安装设置"查看如何添加自己的先决条件.可以吗?还有另一种方法吗?我宁愿不必创建InstallShield Windows Installer,因为在其他方面,默认情况下创建的安装程序适用于我的目的.为了让事件记录工作,创建一个完整的安装程序似乎有些过分.
编辑:到目前为止,似乎没有"简单"的方法来做到这一点,尽管通过遵循链接的指令创建安装程序并不太复杂.
第三种选择是使用log4net或类似的日志记录框架并配置File Appender以记录到文件.
最初我并不是非常热衷于实现文件记录,因为a)我的应用程序不会非常频繁地记录,并且b)我想避免将日志文件分散在难以找到的各个位置.
编辑:这是我到目前为止所做的选项,因为它需要最少的配置,并且如果将来我的日志记录要求发生变化,则可以适应.
我已在项目.csproj文件的 AfterBuild 部分添加了一条命令,如果它是发布配置,则会自动创建 NuGet 包。正如下面的代码片段中所指定的,这部分运行良好。
<Target Name="AfterBuild" Condition=" '$(Configuration)' == 'Release'">
<Exec Command="nuget pack $(ProjectFileName) -IncludeReferencedProjects -Prop Configuration=Release"></Exec>
</Target>
Run Code Online (Sandbox Code Playgroud)
我现在想添加一个附加nuget add $(NugetFileName) -source c:\NugetLocal命令来将 NuGet 包复制到我的本地存储库。不幸的是,该$(NugetFileName)宏不存在。我可以结合使用$(TargetName)宏,.nupkg但包名称包含程序集版本号,似乎没有方便的宏。有没有办法在不使用 MSBuild 脚本的情况下执行此操作?
我正在使用 LINQ 查询将输入字符串解析为类。我已将查询包装在 try/catch 块中以处理解析错误。parsedList问题是异常没有在我期望发生的点被捕获,它只在访问结果对象()的点停止程序流。我是否误解了 LINQ 的工作原理或异常的工作原理?
public class Foo
{
public decimal Price { get; set; }
public decimal VAT { get; set; }
}
public class MyClient
{
public IEnumerable<Foo> ParseStringToList(string inputString)
{
IEnumerable<Foo> parsedList = null;
try
{
string[] lines = inputString.Split(new string[] { "\n" }, StringSplitOptions.None);
// Exception should be generated here
parsedList =
from line in lines
let fields = line.Split('\t')
where fields.Length > 1
select new Foo()
{
Price = Decimal.Parse(fields[0], CultureInfo.InvariantCulture), …Run Code Online (Sandbox Code Playgroud) 我正在使用.NET SDK(https://www.nuget.org/packages/PayPal)使用PayPal REST API将PayPal付款集成到我的网站中。我的网站在Microsoft Azure中作为应用程序服务运行。我有一个配置为使用PayPal Sandbox的测试插槽,以及一个使用实时凭据的生产插槽(配置设置在“应用程序设置”中,并且是特定于插槽的)。
一切在Sandbox中都可以正常工作,并且我可以使用实时配置进行身份验证并获得访问令牌,但是当我尝试处理任何事情时,我都得到了PayPal.IdentityException(我尝试了“付款”以及“计费计划和协议”)。如果查看IdentityException Response(或Details),则会得到以下信息:
{"error":"invalid_token","error_description":"The token passed in was not found in the system"}
Run Code Online (Sandbox Code Playgroud)
进一步挖掘,似乎ApiContext创建的具有AccessToken设置,但是Config属性为null。如果我查看来自的API请求(来自PayPalResource.LastRequestDetails.Value),即使它使用实时配置,它也会将请求发送到api.sandbox.paypal.com,而不是实时API。这似乎是我的问题ApiContext,我建立了如下问题:
public static APIContext Authenticate()
{
string clientId = ConfigurationManager.AppSettings["PayPalClientId"];
string clientSecret = ConfigurationManager.AppSettings["PayPalSecret"];
string mode = ConfigurationManager.AppSettings["PayPalMode"];
var config = new Dictionary<string, string>();
config.Add("mode", mode);
config.Add("clientId", clientId);
config.Add("clientSecret", clientSecret);
accessToken = new OAuthTokenCredential(config).GetAccessToken();
return new APIContext(accessToken); // <--- problem here
}
Run Code Online (Sandbox Code Playgroud)
除了手动构造Config字典,而不是使用字典ConfigManager …
我的网站使用ASP.Net Web Forms,它限制您只有一个表单runat="server",所以我已将所有内容包装在表单标记中.现在,我正在使用Bootstrap 3,并希望使用.form-horizontal单独设置一些表单.似乎要使用Bootstrap水平表单样式,我不得不重新考虑如何在网站上使用表单,或者我将不得不在任何地方使用水平表单,这两者都不是理想的.所以现在看来我必须使用自定义样式来模仿水平表单.有没有更好的办法?
python ×4
c# ×3
.net ×1
asp.net ×1
class ×1
csv ×1
d3.js ×1
decorator ×1
difflib ×1
exception ×1
integration ×1
javascript ×1
linq ×1
logging ×1
namedtuple ×1
nuget ×1
paypal ×1
properties ×1
vsto ×1
webforms ×1