我想做的是:
- 删除csv日期低于25.05.2016 23:59
的所有行- 使用其他名称保存文件
醇>
我在col A
WFQVG98765
FI Quality-Value-Growth
Some Random String 1
Datum
13-05-2016 23:59
14-05-2016 23:59
15-05-2016 23:59
16-05-2016 23:59
17-05-2016 23:59
18-05-2016 23:59
19-05-2016 02:03
.
.
.
.
这就是我现在尝试过的
import csv
import datetime
from dateutil.parser import parse
def is_date(string):
try:
parse(string)
return True
except ValueError:
return False
'''
1. Delete all rows where csv date is lower than 25.05.2016 23:59
2. Save the file with a different name
'''
cmpDate = datetime.datetime.strptime('25.05.2016 23:59:00', '%d.%m.%Y %H:%M:%S')
with open('WF.csv', 'r') as csvfile:
csvReader = csv.reader(csvfile, delimiter=',')
for row in csvReader:
print (row[0])
if is_date(row[0]) and not row[0].strip(' '):
csvDate = datetime.datetime.strptime(row[0], '%d-%m-%Y %H:%M:%S') 'Error Here : ValueError: time data '' does not match format '%d-%m-%Y %H:%M:%S'
我也尝试过这个错误行
csvDate = datetime.datetime.strptime(row[0], '%d-%m-%Y %H:%M') 'But got the same error
if csvDate<cmpDate:
print (row[0]+'TRUE')
如果条件为真,我怎样才能删除该行,最后用不同的名称保存?
答案 0 :(得分:2)
is_date()
正在为您提供误报。在检查日期格式时要更加严格,并且在将日期字符串加载到datetime
时保持一致 - 遵循Zen of Python
- &#34的原则之一;应该有一个 - 最好只有一个 - 显而易见的方式&#34;:
def is_date(date_string):
try:
datetime.datetime.strptime(date_string, '%d-%m-%Y %H:%M:%S')
return True
except ValueError:
return False
换句话说,不要混用dateutil.parser.parse()
和datetime.datetime.strptime()
。
答案 1 :(得分:2)
datetime.datetime.strptime
异常表示您将空字符串传递给row[0]
中的函数。
解决了该问题后,您需要添加代码以将可接受的行写入新文件。
答案 2 :(得分:2)
您可以分析每一行以比较日期,并将要保留的行保存在<?php
require_once "inc.php";
$array = array(); // Let's store our shoutcast variables into an array.
$array['host'] = "xxx.xxx.xx.xxx"; // Your Shoutcast Host
$array['port'] = "xxxx"; // Your Shoutcast Port
$array['extra'] = "/admin.cgi?sid=1&mode=viewxml&page=1"; // The bit that follows in the url to access the xml of the stats
$array['user'] = "xxxxx"; // Admin username (Default is usually "admin")
$array['password'] = "xxxxxxx"; // Admin Password
$radioStats = new radioStats( $array['host'], $array['port'], $array['extra'], $array['user'], $array['password']);
$returnStats = $radioStats->returnStats();
$song = $returnStats['currentSong'];
?>
<div align="center">
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js">
</script>
<link href="votingfiles/voting.css" rel="stylesheet" type="text/css" />
<script src="votingfiles/voting.js" type="text/javascript"></script>
<script>
$(document).ready(function(){
setInterval(function(){cache_clear()},54000);
});
function cache_clear()
{
window.location.reload(true);
}
</script>
<div id="radio_stats">
<?php
if( $returnStats['serverStatus'] != 0 ) {
?>
<?php
if( $returnStats['currentSong'] != "" ) {
echo $returnStats['currentSong'];
} else {
echo "Undefined";
}
?></div>
<br /><br />
<div class="vot_updown1" id="vt_$song"></div>
<?php
}
else {
?>
This radio server appears to be offline.
<?php
}
?>
中。然后,您可以将这些行存储到新的csv文件中,如果您不再需要,则删除旧的。
这是一个剪辑,可以满足您的要求:
list
答案 3 :(得分:2)
当你致电strip
时,你做的是错误的比较。两件事:
row[0].strip()
(不带参数)。这将剥离所有空格(如换行符等),而不仅仅是空格。if is_date(row[0]) and not row[0].strip(' ')
仅在row[0]
为空时通过,这与您想要的相反。这应该是if row[0].strip() and is_date(row[0]):
更好的是,考虑到你的is_date
函数的实现方式,你应该把你的日期时间创建放到一个处理错误的函数中。这是我通常的模式:
def parse_date(str_date):
try:
return datetime.datetime.strptime(str_date, '%d-%m-%Y %H:%M')
except ValueError:
return None
cmp_date = datetime.datetime.strptime('25.05.2016 23:59:00', '%d.%m.%Y %H:%M:%S')
output_rows = []
with open('WF.csv', 'r') as csvfile:
reader = csv.reader(csvfile, delimiter=',')
for row in reader:
csv_date = parse_date(row[0].strip()) # returns a datetime or None
if csv_date and csv_date >= cmp_date:
output_rows.append(row)
# Finally, write output_rows to the output file