seek () не работает должным образом, хотя файл открыт в режиме "r" - PullRequest
0 голосов
/ 22 мая 2018

У меня есть CSV-файл с датами и с плавающей точкой (день, месяц, год, с плавающей точкой).Вот пример,

1,1,2000,4076.79
2,1,2000,1216.82
3,1,2000,1299.68
4,1,2000,637.36
5,1,2000,3877.91
6,1,2000,3308.99
7,1,2000,2925.93
8,1,2000,1559.09
9,1,2000,3190.81
10,1,2000,3008.66
11,1,2000,2026.35
12,1,2000,3279.61
13,1,2000,3601.6
14,1,2000,2021.1
15,1,2000,2103.62
16,1,2000,609.64
17,1,2000,633.16
18,1,2000,1195.34

Я хочу прочитать первую строку, а затем последнюю:

handle = open(getInputFileName(), "r")

getInputFileName () obv.это функция, которая возвращает имя файлазатем

print "numberlines", numberLines        #DEBUG# 
>>> 3660

numberLines - количество строк в файле.затем,

handle.seek(0)
lineData = handle.readline().split(",")
print lineData      #DEBUG#
>>> ['1','1','2000','4076.79\n']

, пока здесь все работает просто отлично.но тогда,

handle.seek(numberLines-1)
lineData = handle.readline().split(",")
print lineData      #DEBUG#
>>>['7', '7', '2000', '2347.51\n']

, но на самом деле последняя строка в файле - 31,12,2009,3823.02, почему поиск не идет полностью вниз?я попытался удалить строку, в которой он застрял, но затем программа вылетела ValueError: could not convert string to float: (затем я использовал lineData в качестве float):

newestDate.insert(1,float(lineData[1]))

Я проверил файл, если была проблема со строками, но форматникогда не меняетсяпочему мой код работает для первой строки, но не для последней?

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Не читайте CSV-файлы вручную (ваш код завершится ошибкой, если в строке есть какой-либо элемент с кавычками, например ...,"1,2000",...).Для этого есть программа для чтения CSV:

import csv
with open("foo.csv") as infile:
    reader = csv.reader(infile)
    data = list(reader)

data[0] # First
# ['1', '1', '2000', '4076.79']
data[-1] # Last
#['18', '1', '2000', '1195.34']

Если проблема с памятью, прочитайте первую строку, пропустите оставшуюся часть файла и сохраните последнюю строку, как описано в другом ответе.

0 голосов
/ 22 мая 2018

file.seek (offset [, wherece]) работает с позициями байтов внутри файла.Не белье.Если вы хотите работать со строками, используйте readline () или итерируйте файл:

with ("file.txt", "r") as f:
    first = next(f) # see comment Jean-François Fabre
    for last in f:  # and tdelanys comment :o)
        pass # do nothing with all other lines, last will hold the last one  

now first и last содержат первую и последнюю строки соответственно.

Преимуществоздесь вы держите в памяти максимум 1 строку текста, а остальные отбрасываете.На самом деле, нет способа просто получить 1-ю и последнюю строку файла, не проходя через него.

Если вы хотите проанализировать данные, следуйте указаниям DyZ об использовании модуля csv ичитатель - безопаснее.Если вы чувствуете себя авантюрным - выбирайте pandas , он имеет множество встроенных возможностей CSV :) и способен читать по частям большой CSV для большей памяти (см. Fe Как читать CSV 6 ГБ).файл с пандами )

...